2015-11-09 49 views
0

我需要正則表達式的幫助。我需要選擇「_id」並將其替換爲「_ID」,但不知道如何完全正確。 示例字符串:「test_id」必須爲「test_ID」,但「test_identification_number」不能爲「test_IDentification_number」。使用正則表達式在字符串中選擇子字符串「_id」

目前,我有這樣的正則表達式:/(?:_ ID $ | ID)/,但它不會工作,因爲它無法與_ID__ID_id_更換_id

謝謝。

**編輯:我使用PHP。

+0

什麼語言是會失敗你使用? –

+0

@ shree.pat18 php – eatmypants

+0

看一看,這個[正則表達式](https://regex101.com/r/yA1vI6/1)是否匹配正確的'id's?嘗試['preg_replace('/ _ id ?![\ p {L} \ d])/',「_ID」,$ str);'](http://ideone.com/J4vEnx) –

回答

2

我會用這個模式:

preg_replace('/(?<=_)id(\b|_)/', 'ID$1', $string); 

demo

工作原理:

  • (?<=_):正回顧後:該模式的其餘部分將只匹配,如果它前面有一個下劃線。下劃線本身未被捕獲(即,不替換)
  • id:字符串文字 - >匹配ID,顯然
  • (\b|_);不是字 - 邊界處(\b),或下劃線分組匹配。這個分組是必需的,因爲像(?:\b|_)積極先行將捕捉到的結尾下劃線(所以你必須與'ID$1'來取代它,但如果先行詞的邊界相匹配(see regex101
+0

我不知道你爲什麼需要積極lookbehind。你爲什麼不把下劃線包含在匹配中,然後再將其添加到替換中?它會不會更有效率? – Amarnasan

+0

很難說。 Perl的正則表達式(PCRE所基於的),實際上可以通過查找斷言勝過標準捕獲匹配,但我不知道這是否適用於PHP。與往常一樣:這取決於,在這種情況下,無論您使用哪種模式,差異都是邊際(如果有的話)。我將這種事情歸類爲微優化 –

+0

它可能或多或少是有效的,畢竟差異肯定是微不足道的。但是你必須同意,增加一個不必要的lookbehind只會增加它的不可讀性和混淆性。就像正則表達式本身沒有足夠的混淆... – Amarnasan

0

您可以使用單詞邊界限定符:\b只會匹配字符串的開頭,字符串的結尾或前一個或後一個字符不是單詞字符。

so _id\b應該只匹配以_id結尾的單詞,而不是_identifier

0

使用的preg_replace使基於正則表達式替換。

$string_modified = preg_replace('/_id(\b|_)/','_ID$1',$string); 
+0

這不會像'test_id_foobar'這樣的字符串工作 –

+0

這就是爲什麼他必須更具體地說明他想要替換的字符串。 – Amarnasan

+0

他對事情非常清楚:'test_id'應該變成'test_ID','test_identifaction_number'不應該改變,但'test_id_number'應該變成'test_ID_number'。 –

相關問題