永发信息网

C++正则表达式 匹配多段字符串并输出

答案:2  悬赏:0  手机版
解决时间 2021-03-27 12:09
  • 提问者网友:十年饮冰
  • 2021-03-27 09:16
C++正则表达式 匹配多段字符串并输出
最佳答案
  • 五星知识达人网友:醉吻情书
  • 2021-03-27 10:54
正则表达式:
(北京时间.*?分).*?发生(.*?级地震).*?(震中距.*?公里)
是这个意思么?
代码:
using System.Text.RegularExpressions;

string text = "北京时间2013年4月20日8时02分四川省雅安市芦山县(北纬30.3,东经103.0)发生7.0级地震。震源深度13公里。震中距成都约100公里。";
string pat = "(北京时间.*?分).*?发生(.*?级地震).*?(震中距.*?公里)";
Regex regex = new Regex(pat);
MatchCollection mc = regex.Matches(text);

foreach (Match m in mc)
{
for (int i = 0; i < m.Groups.Count; i++)
{
Console.WriteLine(m.Groups[i].Value);
}
}

//注:Groups[0]的值是整个匹配的字符串,Groups[1]--Groups[3]的值就是正则表达式中匹配的三个括号里的内容,就是你的问题中的那三个字符串。
输出:
Groups[0]=北京时间2013年4月20日8时02分四川省雅安市芦山县(北纬30.3,东经103.0)发生7.0级地震。震源深度13公里。震中距成都约100公里
Groups[1]=北京时间2013年4月20日8时02分
Groups[2]=7.0级地震
Groups[3]=震中距成都约100公里追问多谢大神!但是这个代码跟我写的差别比较大,我用的是BOOSt库中的正则表达式,你的方法是可行的。
但是我用多个表达式+多个“boost::regex_search(text,m, reg2)”也实现了。
再加一个问题吧追答不要使用:

fin >> in;
使用:
fin.read(...);

例如:

const int bufsize = 1024;
char buf[bufsize+1] = {0};
fin.read(buf, bufsize);
cout << buf;
这段代码假设文件内容长度不会超过1024,如果文件内容的长度未知,可以使用:while (!fin.eof())进行多次read,拼接成一个string。

根据你给出的文字,正则表达式相应修改为:

(北京.*?时间.*?分).*?发生(.*?级.*?地震).*?(震.*?公里)
全部回答
  • 1楼网友:轻雾山林
  • 2021-03-27 12:23
去看正则表达式的语法吧追问这不是语法能解决的问题好不好,语法还不简单,照着看什么文字不能匹配呀,正则表达式还好,要求也不高,就是程序怎么写追答boost里面有API
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯