RegEx使用匹配单词提取句子,而不停留在" Mr。"," Mrs。"等等

时间:2014-10-14 09:32:11

标签: regex

我创建了一个正则表达式,可以提取包含匹配单词的句子。

[^.|?|!]*\<friends\>[^.|!|?]*[\"!?:\.]

但是,它不适用于句子中有Mr.Mrs./ Dr.等的情况。

例如:

The adventures are great. I don't know whether you know that Dr. Watson and Mr. Holmes are good friends, Ms. Adler.

我想要的输出是:

I don't know whether you know that Dr. Watson and Mr. Holmes are good friends, Ms. Adler.

怎么做?

5 个答案:

答案 0 :(得分:2)

通过消极的向前看。

(?:(?!Mr|Ms|Dr|[.?!]).|Mr\.|Ms\.|Dr\.)*\bfriends\b(?:(?!Mr|Ms|Dr|[.?!]).|Mr\.|Ms\.|Dr\.)*[\"!?:.]

DEMO

答案 1 :(得分:1)

您可以使用以下内容:(?:(Dr|Mr|Ms)\.|[^.])+并仅返回第1组匹配的结果。

答案 2 :(得分:1)

\.((([^.]*Mr\.)|([^.]*Dr\.)|([^.]*Ms\.))*[^.]*)(?<=friends)

这应该有效,你可以将“朋友”这个词改成你想在句子中搜索的内容,你可以在 |([^。] * Ms。之后立即添加更多误报。 )以相同的样式,所以如果你也想忽略M.你会添加 |([^。] * M。)然后正则表达式看起来像这样

\.((([^.]*Mr\.)|([^.]*Dr\.)|([^.]*Ms\.)|([^.]*M\.))*[^.]*)(?<=friends)

更新了解决方案,现在它有点笨拙:),它保存在捕获组0

\.(((([^.]*Mr\.)|([^.]*Dr\.)|([^.]*Ms\.)|([^.]*M\.))*[^.]*)(?<=friends)((([^.]*Mr\.)|([^.]*Dr\.)|([^.]*Ms\.)|([^.]*M\.))*[^.!?]*))

答案 3 :(得分:1)

如果您使用的语言支持PCRE风格,这可能是第一个解决方案:

((?:[^.?!]|(?<=Mr|Mrs|Ms|Dr)\.)*)friends(?1)

regex101

上的演示和说明

答案 4 :(得分:1)

你可以使用这个可怕的正则表达式:

/[a-z](?:(?:(?:drs?|m[rs])\.)|[^.|?|!])*friends(?:(?:(?:drs?|m[rs])\.)|[^.|?|!])*[\"!?:\.]/i

您可以将单词friends替换为您想要匹配的内容。

请注意,如果friends是第一个单词,将不会匹配。

您可以使用此匹配,如果friends是第一个字,则匹配:

/(?:friends|[a-z])?(?:(?:(?:drs?|m[rs])\.)|[^.|?|!])*friends(?:(?:(?:drs?|m[rs])\.)|[^.|?|!])*[\"!?:\.]/i

这将匹配句子开始前的空格。

如果这是一个问题,您可以使用:

/\s*((?:friends|[a-z])?(?:(?:(?:drs?|m[rs])\.)|[^.|?|!])*friends(?:(?:(?:drs?|m[rs])\.)|[^.|?|!])*[\"!?:\.])/i

这会将整个句子保存在$1上,并且如果friends是第一句话,则会有效。

所有这些都是使用Javascript测试的,应该适用于其他风格。