当我的文本有单引号时,模式会失败。
我试图用 Perl 来解决它,\\Q
但是\\E
模式编译失败了。
例如
用于图案"(?i)Name is\\b(\\w+)\\b"
如果 text 是"My name is Foampile X"
,我得到一个匹配。但是因为"My name is 'Foampile'"
我没有比赛。
我该怎么做才能像对待任何其他字符一样对待文本中的单引号?
我觉得在任何情况下你都得到一个匹配很奇怪,因为你忽略了前面的空格Foampile
(\b
不消耗一个字符)。请注意,\w
不匹配引号,而仅匹配[a-zA-Z0-9_]
. 因此,根据您是否要包含引号,您可以尝试其中一种:
"(?i)Name is\\W+(\\w+)"
or
"(?i)Name is\\W+?('?\\w+'?)"
如果您想断言名称仅由一个空格分隔,无论是否使用引号,这些可以简化为:
"(?i)Name is '?(\\w+)'?"
or
"(?i)Name is ('?\\w+'?)"
如果您的问题实际上意味着您只是在不带引号的情况下进行了测试,但您的实际目标是只接受引号中的名称,那么您可以忽略?
后面的所有内容'
。
但是,第一个变体将起作用,无论是否有任何非单词字符将名称与句子的其余部分分隔开来。
字符类\w
是任何字母。您将需要扩展您的正则表达式以包含其他可能性:
"Name is [\w']+"
这为正则表达式提供了一组可能的值来扩展,包括字母或引号。但是,强制使用正确引用的名称并不是精确匹配。那看起来更像:
"Name is ['"]?[\w']+['"]?"