我是一個正則表達式的新手,所以希望有些專家可以用簡單的答案對我的問題打個哈欠。我試圖找到並替換以某個字母開頭的單詞,如果它們是複數,則保留它們的複數形式。正則表達式搜索並用可選複數替換
因此,舉例來說,我想以取代「帶」取代「小男孩」和「男孩」與「帶」
text.replace(/\b(b)[\w]+(s?)\b/gi, "<span style=\"font-weight:bold\">$1and$2<\/span>");
然而,$ 2沒有未來與選購「S」。
提前致謝!
我是一個正則表達式的新手,所以希望有些專家可以用簡單的答案對我的問題打個哈欠。我試圖找到並替換以某個字母開頭的單詞,如果它們是複數,則保留它們的複數形式。正則表達式搜索並用可選複數替換
因此,舉例來說,我想以取代「帶」取代「小男孩」和「男孩」與「帶」
text.replace(/\b(b)[\w]+(s?)\b/gi, "<span style=\"font-weight:bold\">$1and$2<\/span>");
然而,$ 2沒有未來與選購「S」。
提前致謝!
只需將[\w]+
更改爲[\w]+?
即可。
這改變
從「貪婪」(匹配儘可能多的字符可能也是唯一多達如果被迫放棄字符)
這意味着s?
不匹配,因爲[\w]+
已經做到了我們。 (錯誤的行爲)
爲「懶惰」(匹配儘可能少的字符越好,只有在絕對必要時增加了比賽)
這給s?
機會來匹配。 (正確的行爲)
順便說一句:您可以將[\w]+?
更改爲\w+?
,它將工作完全相同。
[\w]+
已經匹配了「s」。解決辦法是讓[\w]+
與儘可能少的匹配,而不是儘可能多的「?」修改。因此:
\b(b)[\w]+?(s?)\b
只需使用圖案像/\b(([A-Za-z]{3,})+(s))\b/
$text="boys";
echo preg_replace('/\b(([A-Za-z]{3,})+(s))\b/','$2',$text); //output "boy"
從PHP問題Regex - How to search for singular or plural version of word
繼續如果你知道你的搜索詞是什麼,它可以是非常簡單的。這裏有一個簡單的例子,我在PHP中使用突出顯示搜索詞出現的所有無論是單數,複數簡單(一個或多個),全部小寫或首字母大寫:
function add_highlight($content,$term)
{
//always remove last s if it exists
//and could use similar strategy to test other endings such as -es and -ies
//by conditionally building the regex test string based on term's ending
$term_no_s = rtrim($term,"s");
return preg_replace("/({$term_no_s}s)|({$term_no_s})/i", "<span class='highlight'>$0</span>", $content);
}
完美!我認爲\ w正在抓住它,但我不知道這個選項!謝謝! – normmcgarry
這個解決方案對於某些複數有一些缺點。 _kiss_到_kisses_,_lady_到_ladies_是兩個例子。不太明顯的例子也是_leaf_,_life_到_lives_。您可以用一個或一個條件擴展上面的正則表達式,例如'^ \ b [\ w] +(s | i?es | ves)\ b $''在'kiss'上有點小,但其他大多數情況下它看起來相當匹配。 – mrswadge