2015-09-10 3 views
2

Скажем, я искал слово hello, я хотел бы использовать регулярное выражение:нужно регулярное выражение, чтобы соответствовать слово, которое начинается с символа @

/\bhello\b/ 

И, конечно же, что прекрасно работает. Но мне действительно нужно соответствовать @hello. И я не мог придумать регулярное выражение для выполнения этой работы. Самое близкое, что я нашел, это:

/[@]hello\b/ 

Закрыть, но не идеально.

Проблема в том, что это также относится к материалам типа «x @ hello». Я не смог правильно определить левую границу.

+1

Будет ли левая граница всегда находиться в начале линии? Если это так, префикс RE с помощью '^'. Какие еще шаблоны вы пытаетесь избежать совпадения, и на каком языке вы пишете это? Различные синтаксические анализаторы регулярных выражений следуют различным «правилам». – ghoti

+0

Хороший вопрос - цель, "@hello", может появляться где угодно в строке. Начало, конец или средний ... Я пишу регулярное выражение в java. – JohnC

ответ

2

Вы можете использовать \B перед тем @ для этого:

/\[email protected]\b/ 

RegEx Demo

\B утверждает положение, в котором \b не соответствует.


EDIT: Если требование, чтобы соответствовать @hello только если ему предшествует пробел или линии начинают затем использовать:

(?<=\s|^)@hello\b 
+0

[Я не думаю, что это достаточно подробно] (http://www.regexr.com/3boq7), так как это также соответствует '. @ Hello' и всему, что не является символом слова перед' @ '. –

+0

Хмм в этом случае это может быть '(? <= \ S | ^) @ hello \ b', но мне нравится знать требования OP для этого. – anubhava

+1

The/\ B @ hello \ b/отвечает моим потребностям. Нильс, ты прав, что он соответствует. @ Привет, но только часть @hello находится в матче - это то, что я хочу. Аналогично, это решение не будет соответствовать x @ hello - это то, что я также хочу. Извините, если я не понял - спасибо вам за помощь. Я чему-то научился и сэкономил много времени. – JohnC

2

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

Правильное регулярное выражение, поэтому:

([\s]|^)(@hello)\b 

Proof at regexr.

+0

Super close - но это решение включает в себя предыдущие пробелы в матче. Предпочитаете не иметь этого в согласованном результате. – JohnC

+0

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

+1

Нильс - дал +1, потому что это помогло. Я «принял» другое решение, потому что он более точно соответствовал моему конкретному сценарию. – JohnC

0
function convertHashtags ($str) 
{ 
$regex="/@+([a-zA-Z0-9_]+)/"; 
$str=preg_replace($regex, '<a href="$1">$0</a>', $str); 
return $str; 
} 

echo convertHashtags("hello @stackoverflow kal"); 
Смежные вопросы