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