请教一个正则的问题

Imcx 2015-07-05 10:17:35
<balance>123.456</balance>
这是数据内容,是xml的一个标签,里面的余额有时候有小数,有时候没有小数

然后
表达式一:<balance>(\d+(?:|\.\d+))</balance>
表达式二:(\d+(?:|\.\d+))

我用有小数和没有小数的分别试了一下两个表达式
为什么第二个式子匹配不到小数?
...全文
139 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Imcx 2015-07-05
  • 打赏
  • 举报
回复
引用 2 楼 Imcx_ 的回复:
[quote=引用 1 楼 xuzuning 的回复:] (\d+(?:\.\d+)?)
可能我没讲清楚问题,标签里可能只有整数,也有可能出现小数 <balance>123</balance> <balance>123.456</balance>[/quote] 但是式二值匹配到了整数部分
Imcx 2015-07-05
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
(\d+(?:\.\d+)?)
可能我没讲清楚问题,标签里可能只有整数,也有可能出现小数 <balance>123</balance> <balance>123.456</balance>
xuzuning 2015-07-05
  • 打赏
  • 举报
回复
(\d+(?:\.\d+)?)
xuzuning 2015-07-05
  • 打赏
  • 举报
回复
没有"$"是以表达式的结尾为结尾的吗? 是,表达式匹配结束就结束。不管源串后面还有没有内容 那有没有$出现在式中的? 有,就是说明一定要匹配到源串结束才算成功
Imcx 2015-07-05
  • 打赏
  • 举报
回复
引用 8 楼 xuzuning 的回复:
因为第一式给了明确的结束标志 (\d+(?:|\.\d+))< (\d+(?:\.\d+)?) (\d+(?:\.\d+|)) 两者是等效的,显然前者规范些
没有"$"是以表达式的结尾为结尾的吗? 那有没有$出现在式中的?
xuzuning 2015-07-05
  • 打赏
  • 举报
回复
因为第一式给了明确的结束标志 (\d+(?:|\.\d+))< (\d+(?:\.\d+)?) (\d+(?:\.\d+|)) 两者是等效的,显然前者规范些
Imcx 2015-07-05
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
var xml = @"<balance>123</balance>
<balance>123.456</balance>";
Regex.Matches(xml, @"<balance>(\d+(?:\.\d+)?)</balance>").Cast<Match>().ToList().ForEach(x =>
{
    Console.WriteLine("{0} {1}", x.Groups[0].Value, x.Groups[1].Value);
});
你要的不就是这样吗? \d+(?:\.\d+)? 匹配的是整数部分 \d+(?:\.\d+)? 匹配的是可能有也可能没有的小数部分 你的 (\d+(?:|\.\d+)) 是有问题的 你本意是 空 或 有小数 但那个 空 实际上是指字符间的间隔
引用 5 楼 starfd 的回复:
?:|\.\d+ 你第二个多了表示或的竖线,这样就不会匹配到后面的了,你应该反过来空的在后面
原来如此,我想多问下为什么第一句那样写为什么可以捕获到小数或者没有小数的
  • 打赏
  • 举报
回复
引用 5 楼 starfd 的回复:
?:|\.\d+ 你第二个多了表示或的竖线,这样就不会匹配到后面的了,你应该反过来空的在后面
\d+(?:\.\d+|)
改成这样就可以了
  • 打赏
  • 举报
回复
?:|\.\d+ 你第二个多了表示或的竖线,这样就不会匹配到后面的了,你应该反过来空的在后面
xuzuning 2015-07-05
  • 打赏
  • 举报
回复
var xml = @"<balance>123</balance>
<balance>123.456</balance>";
Regex.Matches(xml, @"<balance>(\d+(?:\.\d+)?)</balance>").Cast<Match>().ToList().ForEach(x =>
{
Console.WriteLine("{0} {1}", x.Groups[0].Value, x.Groups[1].Value);
});


你要的不就是这样吗?
\d+(?:\.\d+)?
匹配的是整数部分
\d+(?:\.\d+)?
匹配的是可能有也可能没有的小数部分

你的 (\d+(?:|\.\d+)) 是有问题的
你本意是 空 或 有小数
但那个 空 实际上是指字符间的间隔

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧