我正在使用正则表达式来匹配包含特定字符串的文本中的整个句子。只要句子以任何类型的标点符号结尾,这就可以正常工作。然而,当句子位于文本末尾且没有任何标点符号时,它不起作用。
这是我现在的表情:
[^.?!]*(?<=[.?\s!])string(?=[\s.?!])[^.?!]*[.?!]
Run Code Online (Sandbox Code Playgroud)
效劳于:
这是一个带字符串的句子。更多文字。
不适用于:
更多文字。这是一个带字符串的句子
有什么办法可以让这个词达到预期的效果吗?我找不到“文本结尾”的任何字符类。
J E*_*rls 10
文本结尾由锚点匹配$,而不是字符类。
您需要解决两个单独的问题:(1) 句子直接在string之后结束,(2) 句子在string之后的某个时间结束但没有句尾标点符号。
为此,您需要将后面的匹配设置string为可选,但将匹配锚定到字符串的末尾。这也意味着,在识别(可选)句尾标点符号后,您需要匹配后面的所有内容,以便字符串结尾锚点匹配。
我的更改:将string原始正则表达式中的所有内容都放在其中(?:...)?-(?:...)作为“未记住”组,并使?整个组可选。按照 来$锚定绳子的末端。
在该可选组中,您还需要使句子结尾本身成为可选,通过将简单替换[.?!]为(?:[.?!].*)?- 再次, the(?:...)是创建一个“未记住”组, the?使该组可选 - 并且.*允许这样做找到句末后可以根据需要进行匹配。
[^.?!]*(?<=[.?\s!])string(?:(?=[\s.?!])[^.?!]*(?:[.?!].*)?)?$
Run Code Online (Sandbox Code Playgroud)