我正在使用正则表达式来匹配包含特定字符串的文本中的整个句子。只要句子以任何标点结尾,这都可以正常工作。但是,如果句子位于文本末尾且没有标点符号,则此方法不起作用。
这是我目前的表情:
[^.?!]*(?<=[.?\s!])string(?=[\s.?!])[^.?!]*[.?!]
效劳于:
这是一个带字串的句子。更多文字。
不适用于:
更多文字。这是一个带字串的句子
有什么办法使这个词符合预期吗?我找不到“文字结尾”的任何字符类。
文本结尾由锚点$
而不是字符类匹配。
您需要解决两个单独的问题:(1)句子直接在字符串之后结束,以及(2)句子在字符串之后的某个时刻结束,但没有句尾标点符号。
为此,您需要在string
可选项之后进行匹配,但是将匹配项锚定到字符串的末尾。这也意味着,在识别(可选的)句子结尾标点符号之后,您需要匹配其后的所有内容,因此字符串结尾锚点将匹配。
我的更改:将所有内容string
放入原始正则表达式中,并放入其中(?:...)?
-(?:...)
作为一个“未被记住”的组,?
并使整个组为可选。跟随$
以锚定字符串的末尾。
在这一可选的组,你也需要做出最终的句子本身可选,通过更换简单[.?!]
用(?:[.?!].*)?
-一遍,(?:...)
是做一个“非记忆”组中,?
使得该组可选-和.*
允许这找到句子结尾后,尽可能地匹配您想要的内容。
[^.?!]*(?<=[.?\s!])string(?:(?=[\s.?!])[^.?!]*(?:[.?!].*)?)?$
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句