2011-09-20 57 views
1

我一直在閱讀一些Q &關於正則表達式,但我還沒有找到答案我的問題。我將使用ra作爲搜索字符串。檢測特定的字符串是否在正則表達式的字符串的開始,中間或結尾

我的問題是我想在任何字符串中找到字符串'ra','ra'將被替換爲'RA',但事情是我只想替換'ra',只要不是部分例如:order_ra替換爲訂購RA,但相機不能用cameRA替換。

我試過所有準備好了[\s|_]ra(?:[\s|_]),並且不起作用,因爲正在尋找類似order_ra的任何東西,或者在最後使用空格排序ra。我想匹配順序ra或者order_ra,不管它有沒有空白。誰可以幫我這個事?我對正則表達式不太瞭解。

我需要這個的原因是因爲我想利用在用戶交互發送但如果屬於一個詞串「RA」動態就像來到* RA *或* RA * DiCal的。我不知道我是否清楚地解釋自己,如果不是,請原諒。

+0

我想你的意思是:'(?:\ S | _)RA(?:\ S | _)' –

+0

好的,謝謝雅各布,但無論哪種方式具有相同的結果,至少測試它與RegexBuilder和或PHP函數preg_replace()。 – raphie

回答

1

通常情況下,您會使用單詞邊界:\bra\b只能匹配ra,不能在單詞內。不幸的是,下劃線被視爲字母數字字符,因此index_ra不匹配。

因此你需要自己實現這個。假設你的正則表達式dialext支持Unicode和環視斷言,可使用

(?<!\p{L})foo(?!\p{L}) 

這符合foo,但不foobarbazfoo

(?<!\p{L}) # Assert that there is no letter before the current position 
foo  # Match foo 
(?!\p{L}) # Assert that there is no letter after the current position 

如果您不能使用Unicode字符類,試試這個:

(?<![^\W\d_])foo(?![^\W\d_]) 

這是一個有點扭曲的邏輯(三勝負!):[^\W\d_]匹配一個字母(=一個不是非字母數字字符而不是數字或下劃線的字符),所以負向查找斷言確保搜索字符串周圍沒有字母(「不是非字母數字或數字或下劃線)」 )。扭曲但必要的,因爲我們也想在這裏開始和結束字符串匹配。

+0

太棒了!感謝您的解釋,將幫助我瞭解我在做什麼,也很棒! – raphie

+0

我喜歡這個答案是,不僅限制我只檢測下劃線(_)作爲分隔符,但任何其他字母數字字符。謝謝! – raphie

1

如果我明白你在找什麼,下面將執行匹配。未捕捉組在的父項中指定。它與OP類似,但也包括開始和結束錨點。

(?:^|\s|_)ra(?:$|\s|_) 
+0

謝謝馬克,這工作完美!就像Tim Pietzcker的回答一樣,感謝兩位! – raphie

相關問題