正则表达式搜索并替换为可选的复数

nor*_*rry 3 regex replace preg-replace

我是正则表达式的新手,所以希望有些专家能够轻松回答我的问题.我试图找到并替换以某个字母开头的单词,如果它们是复数则保持复数.

所以,例如,我想用"乐队"代替"男孩"一词,用"乐队"代替"男孩"

text.replace( /\b(b)[\w]+(s?)\b/gi, "<span style=\"font-weight:bold\">$1and$2<\/span>" );
Run Code Online (Sandbox Code Playgroud)

但是,$ 2没有提供可选的"s".

提前谢谢!

Bry*_*eld 8

只需[\w]+改为[\w]+?.

这种变化

来自"贪婪"(匹配尽可能多的角色,只有在被迫时才提供角色)
这意味着s?不匹配,因为[\w]+已经为我们做了.(错误的行为)

"懒惰"(匹配尽可能少的字符,如果绝对必要,只添加匹配)
,这提供s?了匹配的机会.(正确的行为)

顺便说一句:您可以更改[\w]+?\w+?,它将完全相同.

  • 这个解决方案在一些复数上有点短暂._kiss_到_kisses_,_lady_到_ladies_是两个例子.不太明显的例子也是_leaf_到_leaves_,_ life_到_lives_.你可以用一个或条件来扩展上面的正则表达式,例如`^\b [\ w] +(s | i?es | ves)\ b $`它在匹配的"吻"上略显不足,但大多数其他它似乎很合适. (2认同)