- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有以下正则表达式:
/BAR|FOO BAR/gi
以及以下输入字符串:“FOO BAR”
我希望在“BAR”上获得匹配,但我实际上在“FOO BAR”上获得匹配。这是为什么?
最佳答案
首先,让我们检查一下您的正则表达式:
"/BAR|FOO BAR/gi"
这搜索的是匹配字符串中的 BAR
或 FOO BAR
。标志(假设 perl 符合正则表达式)是“全局的”和“不区分大小写的”:
让我们尝试一些事情以了解匹配的工作原理(注意:我使用 perl
因为它是最流行的正则表达式实现,但这些示例应该适用于您的语言,如果它是合规的):
use warnings;
use strict;
my $string = "FOO BAR";
if ($string =~ /FOO/) { print "1. True\n"; } # 'FOO' matches in string
if ($string =~ /BAR/) { print "2. True\n"; } # 'BAR' matches in string
if ($string =~ /foo/i) { print "3. True\n"; } # 'foo' matches in string, ignoring case
这将为所有 3 个语句 ( demo ) 打印 true
,证明 FOO
、BAR
和 foo
都是带有忽略大小写标志的有效匹配项。
那么,为什么您的正则表达式匹配“FOO BAR
”而不是“BAR
”?
因为,如文档所述,解析器将 try to match the earliest match in the string .
my $string = "FOO BAR";
$string =~ /(FOO BAR|BAR)/;
print $1; # Prints 'FOO BAR'
请注意,设置 /g
不会导致两者匹配,因为它会尽可能多次尝试匹配 ENTIRE 规则 /FOO BAR|BAR/
,而不是匹配规则的每一侧。一旦“FOO BAR
”匹配,它将停止尝试匹配字符串的那部分并继续。
如果你想同时匹配 FOO BAR
和 BAR
,你会怎么做?
This regular expression将匹配 'FOO BAR
' 和 'BAR
' 给定您的输入字符串:
my $string = "FOO BAR";
$string =~ /(FOO (BAR))/;
print "$1\n"; # Prints 'FOO BAR'
print $2; # Prints 'BAR'
上下文中/g
标志的演示
This ,使用 /g
标志,将匹配 FOO
和 BAR
:
my $string = "FOO BAR";
while($string =~ /(FOO|BAR)/g) {
print "$1\n";
}
This example将匹配 FOO
后跟空格、BAR
和 FOO BAR
用于任何输入字符串。
my $string = "FOO BAR";
while($string =~ /((FOO\s)?(BAR))/g) {
print "$1\n$2\n$3";
}
注意:我已经从示例中删除了不相关的标志,以免将来的读者因类似问题而感到困惑。
关于regex - 为什么这个正则表达式匹配第二项而不是第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18382965/
我是一名优秀的程序员,十分优秀!