为什么标记行首的正则表达式不起作用?



为什么注释的正则表达式不像未注释的正则表达式一样?我以为"^"也表示行开始。不是吗?

#include <iostream>
#include <regex>
int main()
{
std::string str ("this subject has a submarine as a subsequence");
std::regex re ("\b(sub)([^ ]*)");
// std::regex re ("^(sub)([^ ]*)");
// std::regex re ("(^sub)([^ ]*)");

std::cout << "entire matches:"; 
std::regex_token_iterator<std::string::iterator> rend;
std::regex_token_iterator<std::string::iterator> a ( str.begin(), str.end(), re );
while (a!=rend) std::cout << " [" << *a++ << "]";
std::cout << std::endl;

return 0;
}

一切正常。它不能匹配任何东西,因为你的行不是以字母"sub,"它以字母" the ">

开头解释这些正则表达式:

  • \b(sub)([^ ]*)

newword,以sub开头,后跟一些非空格字符。两个捕获组,一个用于"子"。还有一个给其他角色。

  • ^(sub)([^ ]*)

newline,以sub开头,后跟一些非空格字符。两个捕获组,一个用于"子"。还有一个给其他角色。

  • (^sub)([^ ]*)

(编辑和上面一样,但是锚是捕获组的一部分。

这两行尝试匹配以sub开头的行,后面跟着0个或多个非空格,例如字符串sub bub:

中的
sub
std::regex re ("^(sub)([^ ]*)");
std::regex re ("(^sub)([^ ]*)");

在该上下文中,^锚使得它只匹配一行的开头。

括号中的^表示不,在所有其他地方表示行开始(除了转义^)

你的未注释模式:b(sub)([^ ]*)

解释:

  • b它代表边界,表示wW中的一个字符之间的空格

注意:w表示0-9之间的所有数字,a-z和a-z之间的所有字符以及下划线字符,W表示除了w之外的所有内容,因此空格属于w

  • (sub)it match "sub"字符串
  • ([^ ]*)表示除空格外的所有内容(更一般的是,当在括号中使用^时,它表示不是所以它表示除空格外的所有内容因为^前面使用了一个空格)

最新更新