正则表达式匹配直到文本结尾

Tim*_*imN 6 regex

我正在使用正则表达式来匹配包含特定字符串的文本中的整个句子。只要句子以任何类型的标点符号结尾,这就可以正常工作。然而,当句子位于文本末尾且没有任何标点符号时,它不起作用。

这是我现在的表情:

 [^.?!]*(?<=[.?\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)