1

我正在使用 re2.h 并进行部分匹配。

假设输入字符串是“123.45.34.5:8080”。应返回“123.45.34.5”和“8080”。

假设输入字符串是“123.45.34.5”。“123.45.34.5”和“”也应该返回。如何编写正则表达式?以下代码不起作用。

string portRegex = "[ \r\t]*([0-9a-f]*)[ \r\t]*";
string IPRegex = "([^ \r\t]*)^[^:]*";
string alertRegexStr = IPRegex + portRegex;
m_alertRegex = new RE2(alertRegexStr.c_str());

   bool match = RE2::PartialMatch(input_string,*m_alertRegex,
                            &cip,
                            &source_port);

谢谢,

更新

现在以下代码有效。

string IPRegex = "([^ \r\t:]*)";

string portRegex = "[ \r\t]*:?[ \r\t]*([0-9a-f]*)[ \r\t]*";

但我有一个问题,为什么 " string IPRegex = "([^ \r\t:]*?)"; " 不起作用?*和有什么区别*

4

2 回答 2

2

为了捕捉周围的两个部分:,您可以使用

^([^:]*)(?::([^:]+))?$

请参阅演示,结果位于捕获组 1 和 2 中。(\n正则表达式演示中的 用于演示目的,因为多行模式已打开。)

关于你的问题

为什么string IPRegex = "([^ \r\t:]*?)";不工作?*?和 和有什么不一样*

它有效,但匹配每个字符和每个单独字符之间的空字符串,因为它可以匹配一个空字符串。

请注意,这*?是一个惰性量词,它匹配 0 个或更多字符但尽可能少。它保证量化字符类只匹配模式其余部分成功所需的字符数。在其他正则表达式风格中,您可以使用积极的(?=:)前瞻,但 re2 不支持环顾。

有关惰性匹配的更多详细信息,请访问rexegg.comregular-expressions.info

于 2015-09-09T22:35:22.417 回答
0

用于输入

“123.45.34.5:8080”。“123.45.34.5”

此正则表达式返回8080

:([0-9]+)

用于输入

“123.45.34.5”。“123.45.34.5”

这个检查char是否:存在..因为它不存在,所以它不会返回任何内容:

(\:)
于 2015-09-09T18:26:19.227 回答