(正则表达式)\ b和NOT \ B之间的错误差异

时间:2017-08-09 20:48:41

标签: javascript php regex perl boost

我想特别针对不同的测试 .shiny-box 的工作原理 应该都处理相同的引擎。

我需要这样做才能对使用这个结构充满信心。

正则表达式引擎是: Perl,PHP,JS和Boost 这些引擎应该 ALL 产生完全相同的结果。

但他们没有。

理论上,\ B应该在任何地方匹配\ b不匹配。
下面的列表显示了在不同引擎上使用完全相同的正则表达式的结果。

对我来说,看起来PHP和JavaScript按照定义工作,
但Perl和Boost略有不同。

如果有人可以验证这些结果和/或阐明是否有任何一个 这是错误的结果 或者,可能存在对 \ b \ B 的定义的误解。 因为,对于这些引擎,它们绝对应该完全相同。

感谢您的时间!

(不包括产生此输出的简单代码,但如果需要,可以是

\B

1 个答案:

答案 0 :(得分:4)

在您使用的版本之后发布的Perl版本中修复了该错误。

$ perl -le'print $^V'
v5.20.1

$ for re in '\b' '\B' '(?!\b)' '(?<!\b)' '(?!\B)' '(?<!\B)' ; do
>    perl -e'printf "%-7s = %s\n", $ARGV[0], "   ssssssssssssss " =~ s/$ARGV[0]/<>/rg' \
>       "$re"
> done
\b      =    <>ssssssssssssss<>
\B      = <> <> <> s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s
(?!\b)  = <> <> <> s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s <>
(?<!\b) = <> <> <> s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s <>
(?!\B)  =    <>ssssssssssssss<>
(?<!\B) =    <>ssssssssssssss<>

$ perl -le'print $^V'
v5.22.0

$ for re in '\b' '\B' '(?!\b)' '(?<!\b)' '(?!\B)' '(?<!\B)' ; do
>    perl -e'printf "%-7s = %s\n", $ARGV[0], "   ssssssssssssss " =~ s/$ARGV[0]/<>/rg' \
>       "$re"
> done
\b      =    <>ssssssssssssss<>
\B      = <> <> <> s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s <>
(?!\b)  = <> <> <> s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s <>
(?<!\b) = <> <> <> s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s<>s <>
(?!\B)  =    <>ssssssssssssss<>
(?<!\B) =    <>ssssssssssssss<>

Boost版本不仅不同;它看起来并不自立。