2012-03-07 2 views
1

Почему этот позитивный взгляд не соответствует тексту, выделенному полужирным шрифтом? (И не -.>)Regex positive lookahead

[_a-z0-9]+(?=\.|->)[_a-z0-9]+ 
hints6. ai_flags = 0; // комментарий hints.ai_flags
hints6. ai_family = AF_UNSPEC;
INT newsocket = Гнездо ( результат -> ai_family, результат -> ai_socktype, результат -> ai_protocol);

ответ

5

первый, вам нужно, чтобы избежать . («ничего» . матчи, вы хотите \., чтобы соответствовать «») [странно - кто-то редактировал вопрос исправить]

секунду, просмотр вперед внешность впереди - ничего не потребляет. так что, даже если вы избежите ., [_a-z0-9]+(?=\.|->) всего «hints6» (а затем, глядя вперед, подтверждая, что символ следующий будет 44. после этого [_a-z0-9]+ не соответствует «.».

Я действительно не понимаю, что вы пытаетесь сделать. насколько я могу видеть, [_a-z0-9]+(?:\.|->)[_a-z0-9]+ будет делать то, что вы хотите, без каких-либо взглядов ((?:...) - это группировка, которая не привязывается к результатам).

В общем, вам не нужно много смотреть, потому что вы можете просто соответствовать. он используется в основном, когда вы хотите соответствовать группе, но по какой-то (странной) причине необходимо заранее проверить конкретный случай.

[edit:] Если вы просто хотите захватить эти два слова, используйте ([_a-z0-9]+)(?:\.|->)([_a-z0-9]+) (обратите внимание, что будет записано две группы, по одному для каждого слова).

[edit2:] Если это для синтаксического маркера, то я думаю, вы могли бы пойти с чем-то, что подчеркивает либо. это проще показать, чем объяснить:

(?:[_a-z0-9]+(?=(?:\.|->)[_a-z0-9]+)|(?<=[_a-z0-9]+(?:\.|->))[_a-z0-9]+) 

, который будет выделить либо «слово с последующим .word» или «слово предшествует слово.», который будет выделить оба слова без выделения точки. они являются двумя отдельными совпадениями, но синтаксический маркер не заботится об этом (я полагаю).

+0

Я использовал '[_a-z0-9] + (?: \. | ->) [_ a-z0-9] +', но он соответствует 'hints6.ai_flags', когда мне нужны только' hints6' и 'ai_flags ' –

+0

см. Править. 1234556 –

+0

Можно ли это сделать без группировки? Регулярное выражение, которое я использую, не предоставляет метод для вызова групп; поэтому я пытался использовать альтернативный метод. –