boost regex 平衡组/递归匹配问题

leeeryan 2010-09-30 01:22:51
用的是boost regex 默认的perl正则语法。
又有A(sdf()dd()f()ss()dd()ff);B(sdf()dd())
想匹配A(....)里面的东西。
正则我是这么写的:

boost::regex reg(
"A\\("
"[^()]*"
"("
"("
"(?'Open'\\()"
"[^()]*"
")+"
"("
"(?'-Open'\\))"
"[^()]*"
")+"
")*"
"(?(Open)(?!))"
"\\)");

"(?(Open)(?!))"加了这句,程序就挂了!
...全文
166 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
leeeryan 2010-09-30
  • 打赏
  • 举报
回复
呵呵,惹taodm大哥发火了,不好意思啊!
TEST_REGEX_SEARCH("\\((?:(?>[^()]+)|(?0))*\\)", perl, "12(abcde(fsh)xyz(foo(bar))lmno)89", match_default, make_array(2, 31, -2, -2));

看懂这个\\((?:(?>[^()]+)|(?0))*\\)了,问题解决了,谢谢taodm哥了!
taodm 2010-09-30
  • 打赏
  • 举报
回复
要和你说多少遍你才能听进去
(?'-Open'是C#语法,perl和它不兼容的,boost库就是没支持过。
perl/boost能兼容到?<> ?''命名组。
leeeryan 2010-09-30
  • 打赏
  • 举报
回复
我的是1.44,完全想不通我的表达式,错在哪了?还有根本没参考.net的那个,不过貌似也是perl兼容的
taodm 2010-09-30
  • 打赏
  • 举报
回复
当然是在boost regex的文档和test代码里啊。
boost库版本低的话就没有的,也就不用挣扎了。
leeeryan 2010-09-30
  • 打赏
  • 举报
回复
TEST_REGEX_SEARCH("\\((?:(?>[^()]+)|(?0))*\\)", perl, "12(abcde(fsh)xyz(foo(bar))lmno)89", match_default, make_array(2, 31, -2, -2));
在哪找的啊?看不懂呀,我去细看看
leeeryan 2010-09-30
  • 打赏
  • 举报
回复
肯定是哪里的小问题,不甘心啊
taodm 2010-09-30
  • 打赏
  • 举报
回复
boost1.42开始的:
TEST_REGEX_SEARCH("\\((?:(?>[^()]+)|(?0))*\\)", perl, "12(abcde(fsh)xyz(foo(bar))lmno)89", match_default, make_array(2, 31, -2, -2));
这是perl的嵌套组语法。
就别抄C#的平衡组代码了,boost不支持。
taodm 2010-09-30
  • 打赏
  • 举报
回复
那就不要用嵌套组。自己搞个状态来自己计数,也没几行代码。
leeeryan 2010-09-30
  • 打赏
  • 举报
回复
哎,项目不能随便改 正则引擎,悲剧啊
taodm 2010-09-30
  • 打赏
  • 举报
回复
挂的原因恐怕就不一样了。
学xpressive要不了多少时间的。
leeeryan 2010-09-30
  • 打赏
  • 举报
回复
我不省略也会挂的(?!.)
taodm 2010-09-30
  • 打赏
  • 举报
回复
(?!pattern)的pattern说了可以省略么?
taodm 2010-09-30
  • 打赏
  • 举报
回复
倒,?!和?|有啥关系么。
leeeryan 2010-09-30
  • 打赏
  • 举报
回复
Lookahead

(?=pattern) consumes zero characters, only if pattern matches.

(?!pattern) consumes zero characters, only if pattern does not match.
leeeryan 2010-09-30
  • 打赏
  • 举报
回复
boost库是支持的呀,他帮助里写的很清楚啊:
Conditional Expressions

(?(condition)yes-pattern|no-pattern) attempts to match yes-pattern if the condition is true, otherwise attempts to match no-pattern.

(?(condition)yes-pattern) attempts to match yes-pattern if the condition is true, otherwise fails.
taodm 2010-09-30
  • 打赏
  • 举报
回复
呃,是指不支持(?!)表示强制失败
taodm 2010-09-30
  • 打赏
  • 举报
回复
boost::regex库不支持?!,别套C#的正则
用boost::xpressive库吧,帮助文档里就有()嵌套例子。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧