需要正则表达式(RegEx)来替换XML中的浮点数

需要正则表达式(RegEx)来替换XML中的浮点数,xml,regex,vb.net,Xml,Regex,Vb.net,我正在使用Visual Basic 2010 Express编辑XML文件。我想用一个零替换具有(通常)非零浮点数的项 首先: <Body RelArmLen="1.234" RelLegLen="-9.876" RelWaist="-3.14159"> 以: <Body RelArmLen="1.234" RelLegLen="0" RelWaist="-3.14159"> 数字可以以-(减号)开头,也可以不以-(减号)开头,并且可以在小数点的任意一侧具有任

我正在使用Visual Basic 2010 Express编辑XML文件。我想用一个零替换具有(通常)非零浮点数的项

首先:

<Body RelArmLen="1.234" RelLegLen="-9.876" RelWaist="-3.14159">

以:

<Body RelArmLen="1.234" RelLegLen="0" RelWaist="-3.14159">

数字可以以-(减号)开头,也可以不以-(减号)开头,并且可以在小数点的任意一侧具有任意位数。如果开始值为零,则可能有也可能没有小数点(即,它可能是“0”或“0.0”或“0.00”)。没有一个值具有+;缺少-意味着积极

(我的问题似乎是如何处理引号;我可以让它匹配从RelLegLen=”到之前的最后一个引号>,或RelLegLen=”本身,而不仅仅是属于RelLegLen的引号之间的浮动)


谢谢

你就不能这样做吗:

RelLegLen="[^"]*"

似乎您想将RelLegLen中的任何内容更改为0。

为什么要尝试使用Regex执行此操作。Net有一个出色的XML解析器,可以为您完成这项工作。有关VB中XML的帮助,请参见本页:

使用非贪婪匹配:

/RelLegLen="(.*?)"/

这将从
/RelLegLen=“
到下一个
匹配。子匹配将包含您的浮点。

切勿使用正则表达式解析XML。从未。你会弄错的。例如,一些建议的“解决方案”将无法匹配使用单引号作为分隔符的属性,但将“成功”匹配文本节点中出现的带引号的字符串


这是XSLT的理想候选者,尤其是支持正则表达式的XSLT2.0。找到要使用模板规则处理的属性,然后使用XPath 2.0表达式“castable as xs:double”来测试格式是否为浮点格式。

主题似乎已完成,但可能有人认为它很有价值,这就是VS2015中用于查找字符串中硬编码数字的正则表达式,效果很好:

\"[-+]?\d+(.\d+)?\"

您应该使用XML解析器(XLINQ)记住:如果您有问题,并且您试图使用正则表达式解决它,那么您现在就有问题了。。。复数Scott Hanselman在他众多演讲中的一个演讲中。你可能是对的。我使用的是RegEx bceause,我想这将是一个简单而直接的文本搜索和替换,我还不如使用我手头的工具,而不是挖掘新的东西。谢谢我得到“未找到搜索文本”。可能是VB 2010 Express中正则表达式的弱实现,或者是我的一个典型。工作起来很有魅力,满足了我的简单需求。谢谢不客气。我通常建议像其他一些用户一样使用XML解析器,但有时也会使用这个简单的正则表达式来替换属性值。通常是在文本编辑器中。是的,我今天所需要的就是快速地将这一个文件保存起来。将来当我有更多的时间或理由时,我将研究解析器。谢谢!对于更广泛的受众来说,这可能是最好的建议。我最初接受的答案恰好适用于我的情况,因为我正在使用的XML文件是允许的格式良好的XML的整个范围的一个非常可预测的子集(也就是说,即使允许使用单引号,我也不希望在这些特定的XML文件中看到它)我同意99%的时候不应该使用正则表达式来解析XML,但我不会说永远不应该使用它。OP上面的评论就是一个很好的例子。如果您有一致的数据,这是一个一次性修复,您可以验证您的修改,继续使用regex。是的,DevNull,我一定会不时使用您的建议来处理我的特定用例,我非常感谢。