regex与什么\b等价,是否有方法将其分解?
我感兴趣的是将regex单词边界regex与什么\b等价,是否有方法将其分解?,regex,perl,Regex,Perl,我感兴趣的是将regex单词边界\b更改为包含其他字符(例如,a不算作边界)。我知道它是\w和\w字符之间的边界 my $_ = ".test"; if ( /(\btest\b)/ ){ print; print " $1\n"; } if ( /((?:(?<=\W)|^)test(?:(?=\W)|$))/ ){ print; print " $1\n"; } 我希望它能扩展成它的等价物。\b等同于什么?你能进一步解释一下\b或其
\b
更改为包含其他字符(例如,a
不算作边界)。我知道它是\w
和\w
字符之间的边界
my $_ = ".test";
if ( /(\btest\b)/ ){
print;
print " $1\n";
}
if ( /((?:(?<=\W)|^)test(?:(?=\W)|$))/ ){
print;
print " $1\n";
}
我希望它能扩展成它的等价物。
\b
等同于什么?你能进一步解释一下\b
或其他表达式吗?\b
是“单词字符”(\w
)和“非单词字符”(与“非单词字符”\w
)之间的零宽度边界。所以这相当于
(?<!\w)(?=\w)|(?<=\w)(?!\w)
(?
因为正则表达式是直接嵌入到Perl代码中的一种独立语言,所以在这里,去parsing不起作用。您可以使用re'debug'
查看正则表达式是如何编译和匹配的(有关如何使用的详细信息,请参阅)。b\b
是“字字符”(\w
)和“非文字字符”(这与“非文字字符”\W
)有细微的区别。因此,它相当于
(?<!\w)(?=\w)|(?<=\w)(?!\w)
(?
由于正则表达式是直接嵌入到Perl代码中的一种独立语言,因此在这里进行去parsing是不起作用的。您可以使用re'debug'
来查看正则表达式是如何编译和匹配的(有关如何使用它的更多信息,请参阅)。\b
在功能上等同于(?)
Deparse的目标是生成Perl对代码理解的可读表示。例如,f()和g();
和g()if f();
以相同的方式编译,因此Deparse将为两者提供更可读的选项,g()if f();
$ perl -MO=Deparse -e'f() and g()'
g() if f();
-e syntax OK
如果\b
和(?编译成相同的代码,Deparse仍然会给您\b
,如果它理解编译的正则表达式。Deparse不是您想要的
也许你想的是简明。它显示了真正执行的内容。请注意下面的和:
$ perl -MO=Concise,-exec -e'g() if f()'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <0> pushmark s
4 <#> gv[*f] s/EARLYCV
5 <1> entersub[t6] sKS/TARG
6 <|> and(other->7) vK/1
7 <0> pushmark s
8 <#> gv[*g] s/EARLYCV
9 <1> entersub[t3] vKS/TARG
a <@> leave[1 ref] vKP/REFC
-e syntax OK
显然,\b
是作为自己的操作实现的。为了进行比较
$ perl -Mre=debug -E'qr/(?<!\w)(?=\w)|(?<=\w)(?!\w)/'`
Compiling REx "(?<!\w)(?=\w)|(?<=\w)(?!\w)"
Final program:
1: BRANCH (12)
2: UNLESSM[-1] (7)
4: POSIXU[\w] (5)
5: SUCCEED (0)
6: TAIL (7)
7: IFMATCH[0] (23)
9: POSIXU[\w] (10)
10: SUCCEED (0)
11: TAIL (23)
12: BRANCH (FAIL)
13: IFMATCH[-1] (18)
15: POSIXU[\w] (16)
16: SUCCEED (0)
17: TAIL (18)
18: UNLESSM[0] (23)
20: POSIXU[\w] (21)
21: SUCCEED (0)
22: TAIL (23)
23: END (0)
minlen 0
Freeing REx: "(?<!\w)(?=\w)|(?<=\w)(?!\w)"
$perl-Mre=debug-E'qr/(?\b
在功能上等同于(?)
Deparse的目标是生成Perl对代码理解的可读表示。例如,f()和g();
和g()if f();
以相同的方式编译,因此Deparse将为两者提供更可读的选项,g()if f();
$ perl -MO=Deparse -e'f() and g()'
g() if f();
-e syntax OK
如果\b
和(?编译成相同的代码,Deparse仍然会给您\b
,如果它理解编译的正则表达式。Deparse不是您想要的
也许你想的是简明。它显示了真正执行的内容。请注意下面的和:
$ perl -MO=Concise,-exec -e'g() if f()'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <0> pushmark s
4 <#> gv[*f] s/EARLYCV
5 <1> entersub[t6] sKS/TARG
6 <|> and(other->7) vK/1
7 <0> pushmark s
8 <#> gv[*g] s/EARLYCV
9 <1> entersub[t3] vKS/TARG
a <@> leave[1 ref] vKP/REFC
-e syntax OK
显然,\b
是作为自己的操作实现的。为了进行比较
$ perl -Mre=debug -E'qr/(?<!\w)(?=\w)|(?<=\w)(?!\w)/'`
Compiling REx "(?<!\w)(?=\w)|(?<=\w)(?!\w)"
Final program:
1: BRANCH (12)
2: UNLESSM[-1] (7)
4: POSIXU[\w] (5)
5: SUCCEED (0)
6: TAIL (7)
7: IFMATCH[0] (23)
9: POSIXU[\w] (10)
10: SUCCEED (0)
11: TAIL (23)
12: BRANCH (FAIL)
13: IFMATCH[-1] (18)
15: POSIXU[\w] (16)
16: SUCCEED (0)
17: TAIL (18)
18: UNLESSM[0] (23)
20: POSIXU[\w] (21)
21: SUCCEED (0)
22: TAIL (23)
23: END (0)
minlen 0
Freeing REx: "(?<!\w)(?=\w)|(?<=\w)(?!\w)"
$perl-Mre=debug-E'qr/(?即使Deparse知道regex,它也不会做任何事情,因为\b
有自己的regex操作码perl-Mre=debug-E'qr/\b/”
vsperl-Mre=debug-E'qr/(?即使Deparse知道regex,它也不会做任何事情,因为\b
有自己的regex操作码perl-Mre=debug-E'qr/\b/'
vsperl-Mre=debug-E'qr/(?)?