- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试更好地理解正则表达式。我正在使用 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]
吃掉所有字符,包括换行符,然后回溯直到它在最后一个新行之前,在这个阶段 \n
, line 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/
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我有以下代码: $('a.btn-slide').toggle(function() { $("#SliderDIV").slideDown("fast"); $(this).text
我需要这个字符串: var x = 'Hi ${name}! How are you? ${name}, you are old! ${name} share with ${other} how do
我正在使用 C#.NET 以 4 人一组的方式做一个项目。虽然我很自然地写下了类似的东西:if (var_name == "some_text"),其中一位小组成员强烈坚持将该行更改为 if ("so
我正在尝试更好地理解正则表达式。我正在使用 Visual Studio 2010。以这个表达式为例。在 Visual Studio 2010 中,您不能使用 [\s\S] 跳过换行符,所以我听说可以使
我是一名优秀的程序员,十分优秀!