2015-09-10 64 views
2

比方說,我一直在尋找這個詞hello,我會使用的正則表達式:需要一個正則表達式匹配與@符號開頭的詞

/\bhello\b/ 

,當然,那個偉大工程。但我真正需要匹配的是@hello。而且我一直無法提出一個正則表達式來完成這項工作。我發現的最接近的東西是:

/[@]hello\b/ 

關閉但並不完美。

問題是,這也匹配像「x @你好」的東西。我一直無法正確定義左邊界。

+1

左邊界是否總是在行首?如果是這樣,用'^'在RE前加上。你試圖避免匹配什麼其他模式,以及你在寫什麼語言?不同的正則表達式解析器遵循不同的「規則」。 – ghoti

+0

好問題 - 目標「@hello」可以出現在字符串的任何位置。開始,結束或中間......我正在用java編寫正則表達式。 – JohnC

回答

2

可以@此之前使用\B

/\[email protected]\b/ 

RegEx Demo

\B斷言位置\b不匹配。


編輯:如果要求只有當它是由空格或行之前開始,然後用它來搭配@hello

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

[我認爲這不夠具體](http://www.regexr.com/3boq7),因爲它也匹配'。@ hello'和其他任何不是'@'之前的單詞字符。 –

+0

嗯,在這種情況下,它可能是'(?<= \ s | ^)@ hello \ b',但我想知道OP對此的要求。 – anubhava

+1

/\ B @ hello \ b /符合我的需求。尼爾斯,你說得對,就是這樣。@你好,但只有@hello部分在比賽中 - 這就是我想要的。同樣,這個解決方案不匹配x @ hello - 這也是我想要的。對不起,如果我不清楚 - 謝謝你們的幫助。我學到了一些東西,節省了很多時間。 – JohnC

2

要匹配所有的情況下,您定義字符串爲在空白前或字符串的開頭,並以字邊界結束。因此

正確正則表達式是:

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

Proof at regexr

+0

超級關閉 - 但此解決方案在匹配中包含前面的空白。不希望在匹配的結果中出現這種情況。 – 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"); 
相關問題