我需要使用正则表达式来匹配特殊键和值。有一个特殊情况,我不知道该怎么做。
字符串类似于abcd/abcd
。我需要在/
之前匹配所有单个单词。
所以我写(.)*/
,然后我发现它只匹配1个令牌(d)。更重要的是,即使它符合我所需要的一切,我仍然不知道有多少令牌匹配。
那么正确的正则表达式应该是什么?真实条件比示例复杂得多,因此如果可以通过正则表达式实现,我不想写一个标记化器。
答案 0 :(得分:2)
您正在使用的Boost库提供了一种方法,可以将重复的组捕获到堆栈中 提供您使用BOOST_REGEX_MATCH_EXTRA
标志集编译库,否则{ {1}}没有名为what
的成员。当您使用captures
或boost::regex_search
时,传递boost::regex_match
标记,您将使用boost::match_extra
捕获所有版本(匹配并捕获任何字符,但换行符,零或更多发生)到通过(.)*
对象的captures
成员可访问的堆栈。
以下是official Boost site的演示方法:
sub_match
答案 1 :(得分:1)
为什么你的正则表达式不起作用
正则表达式(.)*/
匹配任何字符,零次或多次,后跟/
。
*
量词是贪心,它会尽力匹配。给定字符串" abcd / abcd",正则表达式引擎匹配" abcd / abcd",然后它无法匹配" /",所以它回溯到达到" d",最后一步并匹配" /"。 ()
是一个群组,您只会抓住最后一个角色。
如何修复
[^\/]*
这匹配不 a" /" (请注意,它已被转义),正是您想要的。如果要捕获匹配的正则表达式,则应将其更改为([^\/]*)
,现在第一组包含正则表达式。
请注意,根据您使用的语言,可能会有很多解决方案,而不一定是正则表达式。