可能是一个简单的问题,但我对正则表达式相当陌生。
给定一个段落,我想找到一个以指定单词开头的特定句子,并用其他内容替换整个句子。
我如何构建一个正则表达式来搜索以特定单词开头的句子,该单词后面可以跟许多不同的单词,并以.
(句点)结尾。
例如,给定句子foo bar. foo3 bar3. foo2 bar2.
,找到一个以 开头foo3
、包含任意数量的单词并以 结尾的子字符串.
。
可能是一个简单的问题,但我对正则表达式相当陌生。
给定一个段落,我想找到一个以指定单词开头的特定句子,并用其他内容替换整个句子。
我如何构建一个正则表达式来搜索以特定单词开头的句子,该单词后面可以跟许多不同的单词,并以.
(句点)结尾。
例如,给定句子foo bar. foo3 bar3. foo2 bar2.
,找到一个以 开头foo3
、包含任意数量的单词并以 结尾的子字符串.
。
像这样的东西:
/(^|\.\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/
我能想到的最短/最高效:
/foo3\b[^.]*\./
但是,这有几个问题:
foo3 contributed $4.
匹配foo3 contributed $4.83 million to the campaign.
foo3's guts.
in I hate foo3's guts.
)下面的表达式修复了这些问题——尽管它的效率有点低(在标点符号后需要某种空格或字符串结尾):
/(^|[.!?]\s+)foo3\b.*?(?=[.!?](\s|$))[.!?]/
...替换为例如:$1Replacement sentence.