Я хотел проверить работу \B
в частности, по разным
двигатели, которые должны обрабатываться одинаково.
Мне нужно было сделать это, чтобы чувствовать себя уверенно при использовании этой конструкции.
Двигатели регулярных выражений: Perl, PHP, JS и Boost.
Эти двигатели должны ВСЕ произвести точно такой же результат.
Но они этого не делают.
Теоретически, \ B должно совпадать везде, где нет \ b.
В приведенном ниже списке показаны результаты с использованием одного и того же регулярного выражения на разных движках.
Мне кажется, что PHP и JavaScript работают согласно определению,
но Perl и Boost немного отличаются.
Если кто-то может подтвердить эти результаты и / или пролить свет на то,
это результат ошибок.
Или, возможно, существует неправильное представление об определениях \ б а также \ B
поскольку для этих двигателей они абсолютно должны быть абсолютно одинаковыми.
Спасибо за ваше время!
(простой код для создания этого вывода не включен, но может быть при необходимости)
Target = ' ssssssssssssss '
Replacement = '<>'
==================================================
PHP 7.03
\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 5.20
\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 1.64
\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<> <>'
=====================================
JavaScript
\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) = ' <>ssssssssssssss<> '
Ошибка была исправлена в версии 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 не только отличается; это не кажется самосогласованным.
Других решений пока нет …