Проблема с регулярным выражением, которую я не могу понять (отрицательный взгляд назад)

как мне сделать это с регулярным выражением?

я хочу сопоставить эту строку: -myString

но я не хочу сопоставлять -myString в этой строке: --myString

myString, конечно, что угодно.

это вообще возможно?

РЕДАКТИРОВАТЬ:

вот немного больше информации о том, что я получил до сих пор, так как я разместил вопрос:

string to match:
some random stuff here -string1, --string2, other stuff here
regex:
(-)([\w])*

Это регулярное выражение возвращает мне 3 совпадения: -string1, - и -string2

в идеале я бы хотел, чтобы он вернул мне только совпадение -string1


person Mladen Prajdic    schedule 09.02.2009    source источник
comment
Кстати, это весело, и ответы поучительны, но регулярные выражения могут быть неподходящим инструментом для обработки опций (что, как я подозреваю, вы пытаетесь сделать)   -  person dmckee --- ex-moderator kitten    schedule 09.02.2009
comment
хорошо, если я не могу сделать это с регулярным выражением, я сделаю это по-другому. вот я и хотел узнать возможно ли :)   -  person Mladen Prajdic    schedule 09.02.2009
comment
Я уверен, что вы можете сделать это. Только не в том, что это лучший способ. Однако, если вы знакомы с этим методом и не знаете (скажем) lexxing FSM, и он не создает неприемлемых проблем с производительностью или обслуживанием, не стесняйтесь игнорировать меня. Ваше здоровье.   -  person dmckee --- ex-moderator kitten    schedule 09.02.2009
comment
поскольку вы не можете использовать привязки к началу/концу строки, как узнать, когда заканчивается строка1, строка2 и т. д.? Пробелы? запятая?   -  person Joel Coehoorn    schedule 09.02.2009
comment
да пробелы, запятые и прочие знаки препинания   -  person Mladen Prajdic    schedule 09.02.2009


Ответы (6)


Предполагая, что ваш механизм регулярных выражений поддерживает (отрицательный) просмотр назад:

/(?<!-)-myString/

Например, Perl — да, Javascript — нет.

person bart    schedule 09.02.2009
comment
моя машина регулярных выражений находится в .Net. Не знаю, поддерживает ли он это. - person Mladen Prajdic; 09.02.2009
comment
Оно делает. (?‹!-)-\w+ будет общей формой, предполагая, что словесные символы (буквы, цифры, подчеркивание) — это все, что может законно следовать за тире в вашем сценарии. - person Tomalak; 09.02.2009
comment
Томалак, да, это именно то, что мне нужно. как насчет того, чтобы вы поместили это как ответ, чтобы я мог отметить его принятым? - person Mladen Prajdic; 09.02.2009
comment
@Mladen Prajdic: Нет, это было бы немного несправедливо. Решение Барта правильное: публиковать тривиальное улучшение для получения принятого чека — это воровство. ;-) @Bart, не могли бы вы добавить улучшенную версию к своему ответу? - person Tomalak; 10.02.2009
comment
Нужны ли / / (или даже допустимы) в .Net? - person Svish; 12.06.2009

Вы хотите сопоставить строку, начинающуюся с одного дефиса, но не состоящую из нескольких дефисов?

^-[^-]

Объяснение:

^ Matches start of string
- Matches a dash
[^-] Matches anything but a dash
person soulmerge    schedule 09.02.2009
comment
Это позволит добавить больше дефисов позже в строку, это нормально? - person Joel Coehoorn; 09.02.2009
comment
тире разрешены только в начале слова. поэтому, если дальше есть пробел, после него могут быть дасы. но тогда к ним должно применяться то же правило - person Mladen Prajdic; 09.02.2009
comment
Это также будет соответствовать только тире и еще одному символу. т.е. это будет соответствовать -m из -myString. - person Martin Brown; 09.02.2009
comment
Идея состоит в том, чтобы выбрать совпадения из большей строки, чтобы регулярное выражение не могло быть привязано и оно должно соответствовать всему слову, а не только первой букве. - person Alan Moore; 12.06.2009

/^[^-]*-myString/

Тестирование:

[~]$ echo -myString | egrep -e '^[^-]*-myString'
-myString
[~]$ echo --myString | egrep -e '^[^-]*-myString'
[~]$ echo test--myString | egrep -e '^[^-]*-myString'
[~]$ echo test --myString | egrep -e '^[^-]*-myString'
[~]$ echo test -myString | egrep -e '^[^-]*-myString'
test -myString
person Quassnoi    schedule 09.02.2009

основываясь на последнем редактировании, я думаю, что следующее выражение будет работать лучше

\b\-\w+
person Mohamed Ali    schedule 09.02.2009

Без использования каких-либо просмотров, используйте:

(?:^|(?:[\s,]))(?:\-)([^-][a-zA-Z_0-9]+)

Разразился:

(
  ?:^|(?:[\s,])        # Determine if this is at the beginning of the input,
                       # or is preceded by whitespace or a comma
)
(
  ?:\-                 # Check for the first dash
)
(
  [^-][a-zA-Z_0-9]+    # Capture a string that doesn't start with a dash
                       # (the string you are looking for)
)
person Neil Monroe    schedule 09.02.2009

person    schedule
comment
Согласно редактированию OP, требуется совпадение подстроки, поэтому якоря не будут работать. - person Tomalak; 09.02.2009
comment
Обновлено для редактирования. Вопрос только в том, как он решит, как закончить мистическую часть. В этом примере используются пробелы. - person Joel Coehoorn; 09.02.2009
comment
Боюсь, теперь он полностью сломан. ;-) Я также ломал голову над простым решением, не требующим просмотра назад, но я не думаю, что оно существует, когда требуется сопоставление полной строки. - person Tomalak; 10.02.2009