2016-11-21 2 views
0

У меня есть следующий RegEx https://www.regex101.com/r/ZvXQmI/2, который соответствует любому слову, начинающемуся с @. Он работает очень хорошо, однако, он не соответствует строке в начале текста. Оцените, можете ли вы помочь мне в этом. Кроме того, RegEx показывает, что это заняло 1029 шагов. Если это можно уменьшить для повышения производительности, высоко оцените это.Regex соответствует строке в начале текста

Заранее спасибо.

ответ

2

Используйте границы слова.

\B(?<word>@[a-zA-Z]\w+)\b 

https://www.regex101.com/r/ZvXQmI/4

эффективно, \ B соответствует в любом положении между двумя символами слов, а также в любом положении между двумя символами без слов. (требуется исключить домен, где @ предшествует символ слова)

Voila, 42 ступени, одинаковый результат.

+2

'\ b' на самом деле не требуется, потому что' \ w + 'всегда будет захватывать до границы слова. – 4castle

+0

@ 4castle правый, что делает его до 37 шагов. :-) – dognose

+0

вы правы @ 4castle. Я удалил \ b и уменьшил его до 37 шагов. Большое спасибо. – Frenz

0

Попробуйте

(?<word>@[a-zA-Z]\w+)(<|\s+)? 

Demo: https://www.regex101.com/r/ZvXQmI/3

Если вы просто хотите слова, которые начинаются с @, Вы могли бы использовать что-то более простое

@[a-zA-Z]\w+ 
+0

Разве это не делает всю первую часть бессмысленной? – 4castle

+0

@ 4castle Да в некоторой степени. Я удалил его. – Ibrahim

1

Если вы хотите только матч любой слово, начинающийся с @ Вы можете сделать:

(@\w+) 

Demo

Это делает его в 32 шагов. (Или использовать границу слова \B(@\w+) если вы хотите больше конкретики)

Если вы хотите сохранить регулярное выражение и соответствует слово в начале, вы можете добавить ^ для начала строки следующим образом:

(?:>|\s+|^)(?<word>@[a-zA-Z]\w+)(<|\s+)? 

Demo

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