regex与什么\b等价,是否有方法将其分解?

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或其

我感兴趣的是将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
是“单词字符”(
\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/”
vs
perl-Mre=debug-E'qr/(?即使Deparse知道regex,它也不会做任何事情,因为
\b
有自己的regex操作码
perl-Mre=debug-E'qr/\b/'
vs
perl-Mre=debug-E'qr/(?)?