锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 英语翻译 / 标准C++里使用正则Regex
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
技术分类
讨论组翻译
调用Office打印预览
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品开源心得,转载请注明:“锐英源www.wisestudy.cn,孙老师作品,电话13803810136。需要全文内容也请联系孙老师。

标准C++里正确使用正则Regex组


前言

正则是按模式查找定位或找出结果,在字符串处理里经常使用,但初学者不好掌握这个概念,不过可以从简单的地方入手来学,比如开头字符的正则字符串的设置和使用,比如,"^A“匹配以A开头的字符串。简单的功能可以用strstr来代替,但是多个查找目标下就不能用strstr来处理了。本文是个复杂场合下的正则Regex的使用,希望对大家有用。

提问


I want to find all occurences of something like this '{some text}'.

My code is:我想找到所有类似“{some text}”的内容。

我的代码是:

std::wregex e(L"(\\{([a-z]+)\\})");
std::wsmatch m;
std::regex_search(chatMessage, m, e);
std::wcout << "matches for '" << chatMessage << "'\n";
for (size_t i = 0; i < m.size(); ++i) { 
  std::wssub_match sub_match = m[i];
  std::wstring sub_match_str = sub_match.str();
  std::wcout << i << ": " << sub_match_str << '\n';
}    

but for string like this: L"Roses {aaa} {bbb} are {ccc} #ff0000") my output is:但对于像这样的字符串:L“Roses {aaa} {bbb}是{ccc} #ff0000”)我的输出是:

0: {aaa}
1: {aaa}
2: aaa  

and I dont get next substrings. I suspect that there is something wrong with my regular expression. Do anyone of you see what is wrong?我不会得到下一个子串。我怀疑我的正则表达式有问题。你们有谁看到了什么问题?

回答

You're searching once and simply looping through the groups. You instead need to search multiple times and return the correct group only. Try:您正在搜索一次并简单地循环遍历这些组。您需要多次搜索并仅返回正确的组。尝试:

std::wregex e(L"(\\{([a-z]+)\\})");
std::wsmatch m;
std::wcout << "matches for '" << chatMessage << "'\n";
while (std::regex_search(chatMessage, m, e))
{
      std::wssub_match sub_match = m[2];
      std::wstring sub_match_str = sub_match.str();
      std::wcout << sub_match_str << '\n';
      chatMessage = m.suffix().str(); // this advances the position in the string
}  

2 here is the second group, i.e. the second thing in brackets, i.e. ([a-z]+).2这是第二组,即括号中的第二组,即([a-z]+)

有关群组的更多信息,请参阅

回答2

There is nothing wrong with the regular expression, but you need to search for it repeatedly. And than you don't really need the parenthesis anyway.

The std::regex_search finds one occurence of the pattern. That's the {aaa}. The std::wsmatch is just that. It has 3 submatches. The whole string, the content of the outer parenthesis (which is the whole string again) and the content of the inner parenthesis. That's what you are seeing.

You have to call regex_search again on the rest of the string to get the next match:

正则表达式没有任何问题,但您需要重复搜索它。而且你还不需要括号。

在std::regex_search发现一个模式的匹配。那就是{aaa}。该std::wsmatch就是这样。它有3个子匹配。整个字符串,外括号的内容(再次是整个字符串)和内括号的内容。这就是你所看到的。

您必须regex_search再次调用字符串的其余部分才能获得下一个匹配项:

std::wstring::const_iterator begin = chatMessage.begin(), end = chatMessage.end();
  while (std::regex_search(begin, end, m, e))
 {
      // ...      begin = m.end();
  }

回答3

The index operator on a regex_match object returns the matching substring at that index. When the index is 0 it returns the entire matching string, which is why the first line of output is {aaa}. When the index is 1 it returns the contents of the first capture group, that is, the text matched by the part of the regular expression that is between the first ( and the corresponding ). In this example, those are the outermost parentheses, which once again produces {abc}. When the index is 2 is returns the contents of the second capture group, i.e., the text between the second ( and its corresponding ), which gives you the aaa.

The easiest way to search again from where you left off is to use an iterator:

regex_match对象上的索引运算符返回该索引处的匹配子字符串。当索引为0时,它返回整个匹配字符串,这就是第一行输出的原因{aaa}。当索引为1时,它返回第一个捕获组的内容,即正则表达式中第一个(和相应的部分之间匹配的文本)。在这个例子中,那些是最外面的括号,它们再次产生{abc}。当索引为2时,返回第二个捕获组的内容,即第二个捕获组(与其对应的文本),它给出了aaa。

从你离开的地方再次搜索的最简单方法是使用迭代器:

std::wsregex_iterator it(chatMessage.begin(), chatMessage.end(), e);
for ( ; it != wsregex_iterator(); ++it) {
      std::cout << *it << '\n';
  }  

(note: this is a sketch, not tested)(注意:这是草图,未经测试)

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内