我有这个正则表达式:
(?:^|\\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选项?..
答案 0 :(得分:0)
boost使用Perl的语法,因此$
不仅匹配行尾,还匹配“刚好在新行之前”(描述为here)。因此,将regex_constants::no_mod_m
添加到正则表达式的标记解决了我的问题。
另一种方法是按如下方式更改表达式:
(?:\\A|\\n)[ \\t]*(-.*?)(?=\\n[ \\t]*-|\\z)
甚至:
^[ \\t]*(-.*?)(?=\\n[ \\t]*-|\\z)