我创建了一个正则表达式,可以提取包含匹配单词的句子。
[^.|?|!]*\<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.
怎么做?
答案 0 :(得分:2)
通过消极的向前看。
(?:(?!Mr|Ms|Dr|[.?!]).|Mr\.|Ms\.|Dr\.)*\bfriends\b(?:(?!Mr|Ms|Dr|[.?!]).|Mr\.|Ms\.|Dr\.)*[\"!?:.]
答案 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)
答案 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测试的,应该适用于其他风格。