javascript regexp找到特定的句子

时间:2012-04-09 15:48:08

标签: javascript regex

可能是一个简单的问题,但我对正则表达式相当新。

给出一个段落,我想找到一个以指定单词开头的特定句子,并用其他内容替换整个句子。

我如何构建一个正则表达式来搜索以特定单词开头的句子,后面可以跟着许多不同的单词,并以.(句点)结束。

例如,给定句子foo bar. foo3 bar3. foo2 bar2.,找到以foo3开头的子字符串,包含任意数量的单词,并以.结尾。

2 个答案:

答案 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,或者通过包含更多的开头字词来使您的句子更具针对性。

演示:http://jsfiddle.net/qPxFp/2/

答案 1 :(得分:0)

我能想到的最短/最有效率:

/foo3\b[^.]*\./

然而,这有一些问题:

  • 它将匹配一个十进制数字(例如匹配来自foo3 contributed $4.
  • foo3 contributed $4.83 million to the campaign.
  • 从技术上讲,它会将句子中的foo3匹配到句子的末尾(例如匹配foo3's guts.中的I hate foo3's guts.
  • 不允许以感叹号或问号结尾的句子,例如

以下表达式修复了这些问题 - 尽管效率稍低(通过在标点符号后要求某种空格或字符串结尾):

/(^|[.!?]\s+)foo3\b.*?(?=[.!?](\s|$))[.!?]/

...替换为例如:$1Replacement sentence.