1

当我的文本有单引号时,模式会失败。

我试图用 Perl 来解决它,\\Q但是\\E模式编译失败了。

例如

用于图案"(?i)Name is\\b(\\w+)\\b"

如果 text 是"My name is Foampile X",我得到一个匹配。但是因为"My name is 'Foampile'"我没有比赛。

我该怎么做才能像对待任何其他字符一样对待文本中的单引号?

4

2 回答 2

1

我觉得在任何情况下你都得到一个匹配很奇怪,因为你忽略了前面的空格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+'?)"

如果您的问题实际上意味着您只是在不带引号的情况下进行了测试,但您的实际目标是只接受引号中的名称,那么您可以忽略?后面的所有内容'

但是,第一个变体将起作用,无论是否有任何非单词字符将名称与句子的其余部分分隔开来。

于 2012-10-12T00:24:40.347 回答
-1

字符类\w是任何字母。您将需要扩展您的正则表达式以包含其他可能性:

"Name is [\w']+"

这为正则表达式提供了一组可能的值来扩展,包括字母或引号。但是,强制使用正确引用的名称并不是精确匹配。那看起来更像:

"Name is ['"]?[\w']+['"]?"
于 2012-10-12T00:23:28.507 回答