Boost Xpressive - нельзя использовать после (материал) - PullRequest
0 голосов
/ 13 марта 2019

Я нахожусь в процессе преобразования библиотеки регулярных выражений (тысячи регулярных выражений perl) и столкнулся с серьезной проблемой.

Это выражение, которое мне нужно перевести в static xpressive :

(?<![A-ZÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝ]\. )[mM]\.(?! [A-ZÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝ]\. )

Это выражение имеет before и after, отменяющие условия проверки.

Это означает, что обычно я должен использовать ~after и ~before.

Однако, поскольку есть многобайтовые символы, я должен поместить их как строковые литералы.

Поэтому моя первоначальная попытка была такой:

~after(range('A', 'Z')| as_xpr("À")| as_xpr("Á")| as_xpr("Â")| as_xpr("Ã")| as_xpr("Ä")|
       as_xpr("Å")| as_xpr("Ç")| as_xpr("È")| as_xpr("É")| as_xpr("Ê")| as_xpr("Ë")| 
       as_xpr("Ì")| as_xpr("Í")| as_xpr("Î")| as_xpr("Ï")| as_xpr("Ñ")| as_xpr("Ò")| 
       as_xpr("Ó")| as_xpr("Ô")| as_xpr("Õ")| as_xpr("Ö")| as_xpr("Ø")| as_xpr("Ù")| 
       as_xpr("Ú")| as_xpr("Û")| as_xpr("Ü")| as_xpr("Ý") | as_xpr(". ") ) >>
(set= 'm', 'M') >> '.' >>
~before(range('A', 'Z')| as_xpr("À")| as_xpr("Á")| as_xpr("Â")| as_xpr("Ã")| as_xpr("Ä")|
       as_xpr("Å")| as_xpr("Ç")| as_xpr("È")| as_xpr("É")| as_xpr("Ê")| as_xpr("Ë")| 
       as_xpr("Ì")| as_xpr("Í")| as_xpr("Î")| as_xpr("Ï")| as_xpr("Ñ")| as_xpr("Ò")| 
       as_xpr("Ó")| as_xpr("Ô")| as_xpr("Õ")| as_xpr("Ö")| as_xpr("Ø")| as_xpr("Ù")| 
       as_xpr("Ú")| as_xpr("Û")| as_xpr("Ü")| as_xpr("Ý") | as_xpr(". ") )

Однако, поскольку это дает переменнуюколичество символов, оно не скомпилируется.

В любом случае я могу правильно реализовать это регулярное выражение в static xpressive ?

1 Ответ

0 голосов
/ 14 марта 2019

Довольно уродливое решение включает несколько элементов before и after.

Вот решение, которое было протестировано и работает:

(~after(range('A', 'Z') >> as_xpr(". ")  >> as_xpr(". "))  >>
        ~after(as_xpr("À")  >> as_xpr(". ")) >> ~after(as_xpr("Á")  >> as_xpr(". ")) >> ~after(as_xpr("Â")  >> as_xpr(". ")) >>
        ~after(as_xpr("Ã")  >> as_xpr(". ")) >> ~after(as_xpr("Ä")  >> as_xpr(". ")) >> ~after(as_xpr("Å")  >> as_xpr(". ")) >>
        ~after(as_xpr("Ç")  >> as_xpr(". ")) >> ~after(as_xpr("È")  >> as_xpr(". ")) >> ~after(as_xpr("É")  >> as_xpr(". ")) >>
        ~after(as_xpr("Ê")  >> as_xpr(". ")) >> ~after(as_xpr("Ë")  >> as_xpr(". ")) >> ~after(as_xpr("Ì")  >> as_xpr(". ")) >>
        ~after(as_xpr("Í")  >> as_xpr(". ")) >> ~after(as_xpr("Î")  >> as_xpr(". ")) >> ~after(as_xpr("Ï")  >> as_xpr(". ")) >>
        ~after(as_xpr("Ñ")  >> as_xpr(". ")) >> ~after(as_xpr("Ò")  >> as_xpr(". ")) >> ~after(as_xpr("Ó")  >> as_xpr(". ")) >>
        ~after(as_xpr("Ô")  >> as_xpr(". ")) >> ~after(as_xpr("Õ")  >> as_xpr(". ")) >> ~after(as_xpr("Ö")  >> as_xpr(". ")) >>
        ~after(as_xpr("Ø")  >> as_xpr(". ")) >> ~after(as_xpr("Ù")  >> as_xpr(". ")) >> ~after(as_xpr("Ú")  >> as_xpr(". ")) >>
        ~after(as_xpr("Û")  >> as_xpr(". ")) >> ~after(as_xpr("Ü")  >> as_xpr(". ")) >> ~after(as_xpr("Ý")  >> as_xpr(". ")) )  >>
        (boost::xpressive::set= 'm', 'M') >> '.' >>
        (~before(as_xpr(" ") >> range('A', 'Z') >> as_xpr(". "))  >>
                ~before(as_xpr(" ") >> as_xpr("À") >> as_xpr(". ")) >> ~before(as_xpr(" ") >> as_xpr("Á") >> as_xpr(". ")) >>
                ~before(as_xpr(" ") >> as_xpr("Â") >> as_xpr(". ")) >> ~before(as_xpr(" ") >> as_xpr("Ã") >> as_xpr(". ")) >>
                ~before(as_xpr(" ") >> as_xpr("Ä") >> as_xpr(". ")) >> ~before(as_xpr(" ") >> as_xpr("Å") >> as_xpr(". ")) >>
                ~before(as_xpr(" ") >> as_xpr("Ç") >> as_xpr(". ")) >> ~before(as_xpr(" ") >> as_xpr("È") >> as_xpr(". ")) >>
                ~before(as_xpr(" ") >> as_xpr("É") >> as_xpr(". ")) >> ~before(as_xpr(" ") >> as_xpr("Ê") >> as_xpr(". ")) >>
                ~before(as_xpr(" ") >> as_xpr("Ë") >> as_xpr(". ")) >> ~before(as_xpr(" ") >> as_xpr("Ì") >> as_xpr(". ")) >>
                ~before(as_xpr(" ") >> as_xpr("Í") >> as_xpr(". ")) >> ~before(as_xpr(" ") >> as_xpr("Î") >> as_xpr(". ")) >>
                ~before(as_xpr(" ") >> as_xpr("Ï") >> as_xpr(". ")) >> ~before(as_xpr(" ") >> as_xpr("Ñ") >> as_xpr(". ")) >>
                ~before(as_xpr(" ") >> as_xpr("Ò") >> as_xpr(". ")) >> ~before(as_xpr(" ") >> as_xpr("Ó") >> as_xpr(". ")) >>
                ~before(as_xpr(" ") >> as_xpr("Ô") >> as_xpr(". ")) >> ~before(as_xpr(" ") >> as_xpr("Õ") >> as_xpr(". ")) >>
                ~before(as_xpr(" ") >> as_xpr("Ö") >> as_xpr(". ")) >> ~before(as_xpr(" ") >> as_xpr("Ø") >> as_xpr(". ")) >>
                ~before(as_xpr(" ") >> as_xpr("Ù") >> as_xpr(". ")) >> ~before(as_xpr(" ") >> as_xpr("Ú") >> as_xpr(". ")) >>
                ~before(as_xpr(" ") >> as_xpr("Û") >> as_xpr(". ")) >> ~before(as_xpr(" ") >> as_xpr("Ü") >> as_xpr(". ")) >>
                ~before(as_xpr(" ") >> as_xpr("Ý") >> as_xpr(". ")) )

Как уже говорилось ранее, это ужасно, но это преодолевает ограничения xpressive не работающей с символами UTF8 изначально.

...