C++正则表达式 匹配多段字符串并输出
如题,我想用正则表达式匹配并输出,一段文本中的若干信息,例如,“北京时间2013年4月20日8时02分四川省雅安市芦山县(北纬30.3,东经103.0)发生7.0级地震。...
如题,我想用正则表达式匹配并输出,一段文本中的若干信息,例如,“北京时间2013年4月20日8时02分四川省雅安市芦山县(北纬30.3,东经103.0)发生7.0级地震。震源深度13公里。震中距成都约100公里。”以上是目标文本,要求用正则表达式匹配出“北京时间2013年4月20日8时02分”、“7.0级地震”、“震中距成都约100公里”等信息并输出到屏幕。
我用的是VS2010
正则表达式的语法不对照上面文字也可以,简单的正则表达式就行,随便匹配“aa”、“bb”就好了,主要是匹配多个字符串怎么弄?输出匹配到的文字又怎么弄?
ifstream fin;
fin.open("d:\\news.txt");
std::string in, out;
if (!fin.is_open())
cout << "没有打开文件\n";
else
{
fin >> in;
}
为什么只能输出”1月/t“
news.txt中的内容是"1月/t 12日/t ,/wd 在/p 海地/nsf 首都/n 太子港/nsf ,/wd 人们/n 站/vi 在/p 倒塌/v 的/ude1 建筑物/n 旁/f 。/wj 据/p 中国/ns 国家/n 地震/n 台网/n 测定/vn ,/wd 北京/ns 时间/n 1月/t 13日/t 5时/t 53分/t ,/wd 在/p 海地/nsf 地区/n (/wkz 北纬/b 18.5/m 度/qv ,/wd 西/f 经/p 72.5/m 度/qv )/wky 发生/v 7.3/m 级/q 地震/n ,/wd 震源/n 深度/n 约/d 10/n 公里/q 。/wj" 展开
我用的是VS2010
正则表达式的语法不对照上面文字也可以,简单的正则表达式就行,随便匹配“aa”、“bb”就好了,主要是匹配多个字符串怎么弄?输出匹配到的文字又怎么弄?
ifstream fin;
fin.open("d:\\news.txt");
std::string in, out;
if (!fin.is_open())
cout << "没有打开文件\n";
else
{
fin >> in;
}
为什么只能输出”1月/t“
news.txt中的内容是"1月/t 12日/t ,/wd 在/p 海地/nsf 首都/n 太子港/nsf ,/wd 人们/n 站/vi 在/p 倒塌/v 的/ude1 建筑物/n 旁/f 。/wj 据/p 中国/ns 国家/n 地震/n 台网/n 测定/vn ,/wd 北京/ns 时间/n 1月/t 13日/t 5时/t 53分/t ,/wd 在/p 海地/nsf 地区/n (/wkz 北纬/b 18.5/m 度/qv ,/wd 西/f 经/p 72.5/m 度/qv )/wky 发生/v 7.3/m 级/q 地震/n ,/wd 震源/n 深度/n 约/d 10/n 公里/q 。/wj" 展开
2个回答
展开全部
正则表达式:
(北京时间.*?分).*?发生(.*?级地震).*?(震中距.*?公里)
是这个意思么?
代码:
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公里
(北京时间.*?分).*?发生(.*?级地震).*?(震中距.*?公里)
是这个意思么?
代码:
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。
根据你给出的文字,正则表达式相应修改为:
(北京.*?时间.*?分).*?发生(.*?级.*?地震).*?(震.*?公里)
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
去看正则表达式的语法吧
追问
这不是语法能解决的问题好不好,语法还不简单,照着看什么文字不能匹配呀,正则表达式还好,要求也不高,就是程序怎么写
追答
boost里面有API
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询