1

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

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

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

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

4

2 回答 2

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(global) 标志。如果您只想更改第一个句子,请删除g,或通过包含更多开头单词使您的句子匹配更具体。

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

于 2012-04-09T15:50:22.917 回答
0

我能想到的最短/最高效:

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

但是,这有几个问题:

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

下面的表达式修复了这些问题——尽管它的效率有点低(在标点符号后需要某种空格或字符串结尾):

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

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

于 2012-04-09T16:05:38.620 回答