我使用Regex匹配包含特定字符串的文本中的整个句子。只要句子以任何标点符号结束,这都可以正常工作。但是当句子在文本的末尾没有任何标点时,它不起作用。
这是我目前的表达方式:
[^.?!]*(?<=[.?\s!])string(?=[\s.?!])[^.?!]*[.?!]
适用于:
这是字符串的句子。更多文字。
不起作用:
更多文字。这是一个带有字符串
的句子
有没有办法按照预期说出这个词?我找不到&#34;文本结尾&#34;。
的任何字符类答案 0 :(得分:2)
文本结尾由锚$
匹配,而不是字符类。
您需要解决两个不同的问题:(1)直接在字符串之后结束的句子,以及(2)在字符串之后的某个时间结束的句子但没有句末标点符号。
要执行此操作,您需要在string
可选后进行匹配,但是匹配到字符串末尾的锚点。这也意味着,在识别(可选的)句末标点符号后,您需要匹配后面的所有内容,因此字符串结尾的锚点将匹配。
我的更改:在原始正则表达式中string
之后的所有内容并将其包围在(?:...)?
中 - (?:...)
是一个“未记住”的群组,?
使整个组可选。然后使用$
来锚定字符串的结尾。
在该可选组中,您还需要将句子尾部本身设为可选,将简单[.?!]
替换为(?:[.?!].*)?
- 再次,(?:...)
即可“未记住的”群组,?
会使群组成为可选群组 - .*
允许此内容在找到句子结尾后尽可能多地匹配。
[^.?!]*(?<=[.?\s!])string(?:(?=[\s.?!])[^.?!]*(?:[.?!].*)?)?$
答案 1 :(得分:1)
文字结尾的符号为$
(如果您需要的话,文字开头的符号为^
)。
您可能只是将$
添加到您的标点符号列表中(例如[.?!$]
),但您可能无法获得您正在寻找的内容;您会发现它可以更好地作为替代选择:([.?!]|$)
。
答案 2 :(得分:0)
你的正则表达式太复杂了,无法实现。
仅匹配单词只需使用
"\bstring\b"
它将匹配start,end和任何非alphanum分隔符。
它适用于以下内容:
string is at the start
this is the end string
this is a string.
stringing won't match (you don't want a match here)
答案 3 :(得分:0)
您应该在问题中添加语言,以获取有关使用的更多信息。
以下是使用javascript的示例:
var reg = /^([\w\s\.]*)string([\w\s\.]*)$/;
console.log(reg.test('This is a sentence with string. More text.'));
console.log(reg.test('More text. This is a sentence with string'));
console.log(reg.test('string'))
&#13;
注意:
*
:匹配零次或多次。
? :匹配零次或一次。
+
:匹配一次或多次。
您可以更改*
吗?或+如果你想要更多的定义。