我想特别针对不同的测试 .shiny-box
的工作原理
应该都处理相同的引擎。
我需要这样做才能对使用这个结构充满信心。
正则表达式引擎是: Perl,PHP,JS和Boost 这些引擎应该 ALL 产生完全相同的结果。
但他们没有。
理论上,\ B应该在任何地方匹配\ b不匹配。
下面的列表显示了在不同引擎上使用完全相同的正则表达式的结果。
对我来说,看起来PHP和JavaScript按照定义工作,
但Perl和Boost略有不同。
如果有人可以验证这些结果和/或阐明是否有任何一个 这是错误的结果 或者,可能存在对 \ b 和 \ B 的定义的误解。 因为,对于这些引擎,它们绝对应该完全相同。
感谢您的时间!
(不包括产生此输出的简单代码,但如果需要,可以是
)\B
答案 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版本不仅不同;它看起来并不自立。