2009-02-09 3 views
2

Как мне это сделать с регулярным выражением?Проблема с регулярным выражением Я не могу понять (отрицательный lookbehind)

я хочу, чтобы соответствовать этой строке: -myString

, но я не хочу, чтобы соответствовать -myString в этой строке: --myString

туЗЬптд, конечно, что-нибудь.

это возможно?

EDIT:

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

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

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

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

+0

BTW - это хорошая забава, и ответы поучительны, но регулярные выражения могут быть не лучшим инструментом для обработки опций (что я подозреваю это то, что вы пытаетесь сделать) – dmckee

+0

хорошо, если я не могу сделать это с регулярным выражением, я сделаю это по-другому. вот почему я хотел узнать, возможно ли это :) –

+0

Я уверен, что вы это сделаете. Просто не то, что это лучший способ. Однако, если вы знаете этот метод и не знаете (скажем) FSM lexxing, и он не представляет неприемлемых проблем с производительностью или обслуживанием, не стесняйтесь игнорировать меня. Приветствия. – dmckee

ответ

11

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

/(?<!-)-myString/ 

Perl делает, Javascript не делает, f или пример.

+0

Моя машина регулярных выражений - одна в .Net. Не знаю, поддерживает ли это. –

+0

Он делает. «(? Tomalak

+0

Tomalak, да, это именно то, что мне нужно. как насчет того, чтобы вы положили это в качестве ответа, чтобы я мог отметить его? –

0
/^[^-]*-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 
0

Вы хотите, чтобы соответствовать строке, которая начинается с одним дефисом, но не один, что имеет несколько тира?

^-[^-] 

Объяснение:

^ Matches start of string 
- Matches a dash 
[^-] Matches anything but a dash 
+0

Это позволило бы больше штрихов позже в строке, это нормально? –

+0

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

+0

Это также будет соответствовать тире и еще одному символу. т.е. он будет соответствовать -m из -myString. –

0

[^ -] {0,1} - [^ \ ш -] +

+0

В соответствии с редактированием OP требуется совпадение строки, поэтому привязки не будут работать. – Tomalak

+0

Обновлено для редактирования. Единственный вопрос в том, как он решает, как закончить часть «mystring». В этом примере используется пробел. –

+0

Боюсь, теперь он полностью сломан. ;-) Я тоже ломал голову за простое решение, не требующее внешнего вида, но я не думаю, что он есть, когда требуется полный набор строк. – Tomalak

0

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

\b\-\w+ 
0

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

(?:^|(?:[\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) 
) 

 Смежные вопросы

  • Нет связанных вопросов^_^