gpt4 book ai didi

C++11 正则表达式多行 : Why does the group ([^\\0]+\n)? some_text 在 match[1] 中包含所有内容?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:35 29 4
gpt4 key购买 nike

我正在尝试更好地理解正则表达式。我正在使用 Visual Studio 2010。以这个表达式为例。在 Visual Studio 2010 中,您不能使用 [\s\S] 跳过换行符,所以我听说可以使用 [^\0]。在表达式中,我想匹配一行,但前提是它是 line 3

if(regex_search("line 1\nline 2\nline 3\n",
match,
regex("^([^\\0]+\\n)?line (3)\\n")))
{
cout << "match.length(): " << match.length() << endl;

for(unsigned i = 0; i < match.size(); ++i)
{
cout << "match[" << i <<"]: \"" << match[i] << "\"" << endl;
}
}

请注意以上代码不适用于 gcc < 4.9 或 ideone(因为它使用 gcc < 4.9)。

在 Visual Studio 2010 中,代码返回:

match.length(): 21
match[0]: "line 1
line 2
line 3
"
match[1]: "line 1
line 2
line 3
"
match[2]: "3"

我确信有更好的方法来匹配行,但我的问题是为什么 match[1] 组匹配整个输入?我认为正则表达式会读取 line 1\nline 2\n for match[1] 并停止,因为在正则表达式中它后面有 line 3。正则表达式中是否有相应的词或者它是一个错误?

谢谢,如果您有编辑权限,欢迎您对其进行编辑,以便更容易理解。

最佳答案

郑重声明,这在 Visual Studio 中有效并找到第三行,返回“第 3 行::

^(?<=(?:[^\n]+\n){2})[^\n]+

至于你的表情,

^([^\0]+\n)?line (3)\n

我们必须决定您是尝试在 Visual Studio 的查找功能 中进行匹配,还是通过在 Visual Studio 中制作控制台程序来进行匹配。这是两种截然不同的情况。

A.在 Visual Studio 的查找功能中

在 Visual Studio 的 Find 函数中,如果你创建这样一个文本文件:

line 1
line 2
line 3

您的正则表达式将不匹配。为什么?因为在 line 3 之后你找不到 \n在 Visual Studio 文件中。相反,在换行符处,您会找到 \r\n这是标准的 Windows 换行符。

添加 \r修复它:

^([^\0]+\n)?line (3)\r\n

也就是说,这个正则表达式匹配任何行,而不仅仅是第 3 行,原因很简单 [^\0]吃掉所有字符,包括换行符,然后回溯到最后的换行符之前,在这个阶段 \n , line 3\n token 完成比赛。如果您想使用 [^\0] 而不是 [^\n],这将确保您匹配第 3 行:

^(?<=([^\0]+?\n){2})line 3\r\n

B.在 Visual Studio 中构建的控制台应用中

如果您向控制台应用程序提供您的字符串 "line 1\nline 2\nline 3\n" ,然后您的原始正则表达式匹配。然而,由于上述原因,它匹配所有三行([^\0] 吃掉所有字符,包括换行符,然后回溯直到它在最后一个新行之前,在这个阶段 \nline 3\n 个 token 完成匹配)。

在这里,如果你只想要第 3 行并使用 [^\0] ,你可以使用这个例如:

^(?<=([^\0]+?\n){2})line 3\n

关于C++11 正则表达式多行 : Why does the group ([^\\0]+\n)? some_text 在 match[1] 中包含所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23483411/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com