Несовпадающие полные слова, если удовлетворен отрицательный взгляд - PullRequest
2 голосов
/ 20 октября 2019

Мне нужно сопоставлять только те слова, которые не имеют специальных символов, таких как @ и :. Например:

  1. git@github.com не должно совпадать
  2. list должно возвращать действительное совпадение
  3. show также должно возвращать действительное совпадение

Я пробовал использовать отрицательный взгляд \w+(?![@:])

Но это соответствует gi из git@github.com, но это тоже не должно совпадать.

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

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

(?<!\S)\w+(?!\S)

Демонстрация: https://regex101.com/r/cjhUUM/2

2 голосов
/ 20 октября 2019

Вы можете добавить \w к предпросмотру:

\w+(?![\w@:])

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

^\w+(?![\w@:])

Или

(?<!\S)\w+(?![\w@:])

^ будет соответствовать слову в начале строки, а (?<!S) будет соответствовать только в том случае, если перед словом стоит пробел или начало строки.

См. Демонстрационную версию regex .

Почему бы не (?<!\S)\w+(?!\S), границы пробелов ? Поскольку, поскольку вы создаете лексер, вам, скорее всего, придется иметь дело с предложениями на естественном языке, где за словами, вероятно, будут следовать знаки препинания, а отрицательный прогноз (?!\S) сделает совпадение \w+ только тогда, когда за ним будет пробел илив конце строки.

...