我正在转换正则表达式库(数千个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(". ") )
但是,由于它提供了可变数量的字符,因此将无法编译。
无论如何,我是否可以在静态xpressive 中正确实现此正则表达式?
答案 0 :(得分:0)
这个相当丑陋的解决方案涉及多个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字符的局限性。