boost :: regexp意外行为

时间:2016-03-24 12:46:50

标签: c++ regex boost

我有这个正则表达式:

(?:^|\\n)[ \\t]*(-(.|\\n)*?)(?=\\n[ \\t]*-|$)

我想将它与此文本一起使用

 -h --help                 Show this screen.
 --version                 Show version.
 --prefix=<path>           Set the specified path as the prefix
                           for paths mentioned below (except ones
                           specified manually).
 -c, --config=<cfg-file>   Configuration file name
                           [default: <prefix>/etc/myprog/protocols.conf].
 --script=<asl-file>       Input script file which will be played.
                           If not specified then contents of the
                           <prefix>/etc/myprog/script.active will be taken.

找出每个选项及其说明。使用来自GCC 5.3的<regex>,此表达式按预期工作,但如果我包含<boost/regex.hpp>(此时的最后一个版本),则匹配

 --prefix=<path>           Set the specified path as the prefix

但不是

 --prefix=<path>           Set the specified path as the prefix
                           for paths mentioned below (except ones
                           specified manually).

有任何想法吗?

ADD:

我在http://www.regextester.com/测试了这个正则表达式 - 它的行为也符合预期。

ADD:

我使用boost的regexp源构建了一个共享库,但没有任何更改;我用makefile中的这一行完成了这个:

g++ -std=c++0x -I../../include -O3 -Wall -c -fmessage-length=0 -fPIC -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"

g++ -Wl,--no-undefined -shared -o "libregex.so" $(OBJS) $(USER_OBJS) $(LIBS)

也许我需要调整boost :: regex的Unicode选项?..

1 个答案:

答案 0 :(得分:0)

boost使用Perl的语法,因此$不仅匹配行尾,还匹配“刚好在新行之前”(描述为here)。因此,将regex_constants::no_mod_m添加到正则表达式的标记解决了我的问题。

另一种方法是按如下方式更改表达式:

(?:\\A|\\n)[ \\t]*(-.*?)(?=\\n[ \\t]*-|\\z)

甚至:

^[ \\t]*(-.*?)(?=\\n[ \\t]*-|\\z)