使用 C++ RegEx 的 lookbehind 的替代方案是什么?
What is an alternative for lookbehind with C++ RegEx?
我正在使用以下模式:
(?<=<)(?<!>).*?q.*?(?!<)(?=>)
它使用正面和负面的前瞻和后视来匹配包含在匹配括号中的文字 q
。
std::regex
不支持回顾。那么什么是好的选择?
请注意 (?<=<)(?<!>)
等于 (?<=<)
(因为 <
需要紧靠当前位置的左侧,所以不能有任何 >
)和(?!<)(?=>)
等于 (?=>)
(同样的逻辑适用于此,因为 >
必须紧靠右边,不会有任何 <
)。第一个 .*?
不会匹配可能的最短子字符串,它会从字面上找到第一个 q
的方式,然后是任何 0+ 个字符,直到第一个 >
。因此,即使在支持后视的引擎中,该模式也很难为您工作。
我宁愿将 <([^<>q]*q[^<>]*)>
正则表达式与 捕获组 和文字消耗 <
和 >
符号一起使用 [=38] =] 的表达式:
std::regex r("<([^<>q]*q[^<>]*)>");
std::string s = "<adqsdq<><abc>5<abq>6<qaz> <hjfffffffk>";
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
i != std::sregex_iterator();
++i)
{
std::cout << (*i).str(1) << srd::endl;
}
输出:abq
和 qaz
我正在使用以下模式:
(?<=<)(?<!>).*?q.*?(?!<)(?=>)
它使用正面和负面的前瞻和后视来匹配包含在匹配括号中的文字 q
。
std::regex
不支持回顾。那么什么是好的选择?
请注意 (?<=<)(?<!>)
等于 (?<=<)
(因为 <
需要紧靠当前位置的左侧,所以不能有任何 >
)和(?!<)(?=>)
等于 (?=>)
(同样的逻辑适用于此,因为 >
必须紧靠右边,不会有任何 <
)。第一个 .*?
不会匹配可能的最短子字符串,它会从字面上找到第一个 q
的方式,然后是任何 0+ 个字符,直到第一个 >
。因此,即使在支持后视的引擎中,该模式也很难为您工作。
我宁愿将 <([^<>q]*q[^<>]*)>
正则表达式与 捕获组 和文字消耗 <
和 >
符号一起使用 [=38] =] 的表达式:
std::regex r("<([^<>q]*q[^<>]*)>");
std::string s = "<adqsdq<><abc>5<abq>6<qaz> <hjfffffffk>";
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
i != std::sregex_iterator();
++i)
{
std::cout << (*i).str(1) << srd::endl;
}
输出:abq
和 qaz