可能是一个简单的问题,但我对正则表达式相当新。
给出一个段落,我想找到一个以指定单词开头的特定句子,并用其他内容替换整个句子。
我如何构建一个正则表达式来搜索以特定单词开头的句子,后面可以跟着许多不同的单词,并以.
(句点)结束。
例如,给定句子foo bar. foo3 bar3. foo2 bar2.
,找到以foo3
开头的子字符串,包含任意数量的单词,并以.
结尾。
答案 0 :(得分:3)
这样的事情:
/(^|\.\s+)(foo3[^.]*\.)/
搜索标记前一句的句点(或第一句的情况下字符串的开头),后跟空格,然后是起始字符序列(在本例中为foo3
),后跟所有非句号字符,直至句末结束。
演示:http://www.rubular.com/r/ROl2odiDn5
以下是在实践中如何替换句子的方法:
var str = "foo bar. foo3 bar3. foo2 bar2.";
var regex = /(^|\.\s+)(foo3[^.]*\.)/g;
str = str.replace(regex, "$1new sentence.");
alert(str);
在这个例子中,我使用正则表达式替换并通过$1
合并额外匹配的字符(来自前一句的句点),然后是要替换旧句子的新句子。这确保了段落中其他句子的状态保持不变。另请注意,此示例将更新所有匹配的句子,因为我使用/g
(全局)标志。如果您只想更改第一个句子,请删除g
,或者通过包含更多的开头字词来使您的句子更具针对性。
答案 1 :(得分:0)
我能想到的最短/最有效率:
/foo3\b[^.]*\./
然而,这有一些问题:
foo3 contributed $4.
foo3 contributed $4.83 million to the campaign.
foo3's guts.
中的I hate foo3's guts.
)以下表达式修复了这些问题 - 尽管效率稍低(通过在标点符号后要求某种空格或字符串结尾):
/(^|[.!?]\s+)foo3\b.*?(?=[.!?](\s|$))[.!?]/
...替换为例如:$1Replacement sentence.