记事本++;或PowerGrep regex来查找、乘以和替换价格

记事本++;或PowerGrep regex来查找、乘以和替换价格,regex,replace,notepad++,powergrep,Regex,Replace,Notepad++,Powergrep,我有一个xml文件,需要查找、乘以(例如乘以1.25)并替换所有价格 价格标签如下所示: 操作后,价格标签应如下所示: 这可以在Notepad++或PowerGrep中使用正则表达式实现吗 提前谢谢。据我所知,您不能使用任何一个程序来进行数学运算,但您可以使用您选择的大多数语言构建一个简单的程序来获取文件,使用正则表达式来查找数字。将该字符串转换为双精度,进行数学运算,然后将其放回字符串中。今天晚些时候,我可能会用c#构建一些东西,但在大多数语言中,它应该是相对简单的。如果您不在window

我有一个xml文件,需要查找、乘以(例如乘以1.25)并替换所有价格

价格标签如下所示:

操作后,价格标签应如下所示:

这可以在Notepad++或PowerGrep中使用正则表达式实现吗


提前谢谢。

据我所知,您不能使用任何一个程序来进行数学运算,但您可以使用您选择的大多数语言构建一个简单的程序来获取文件,使用正则表达式来查找数字。将该字符串转换为双精度,进行数学运算,然后将其放回字符串中。今天晚些时候,我可能会用c#构建一些东西,但在大多数语言中,它应该是相对简单的。如果您不在windows环境中或使用Powershell for windows,您甚至可以构建一个shell脚本并使用grep,但我对Powershell的使用经验较少

编辑:有一种更简单的方法可以做到这一点 这基本上就是使用xmldocument对象要做的事情

Edit2:虽然我找不到原始海报,但我还是这么做了。我想可能有人能利用这些信息,我学到了很多。如果有人感兴趣,我可以将源代码添加到github

public static void ChangePricesWork(string filepath, double multiply)
{
  var document = new XmlDocument();
  document.Load(filepath);
  XmlNodeList nodeList = document.GetElementsByTagName("price");

  foreach (XmlNode node in nodeList)
  {
      if (!string.IsNullOrEmpty(node.InnerText))
      {
         node.InnerText = Convert.ToString(multiplyPrice(multiply, node.InnerText));
      }

   }

   string newFilePath = string.Format(@"{0}\{1}_updated.xml", Path.GetDirectoryName(filepath),   Path.GetFileNameWithoutExtension(filepath)); 
   document.Save(newFilePath);
}

   private static double multiplyPrice(double multiply, string oldPrice)
   {
     var newPrice = new double();
     if (Double.TryParse(oldPrice, out newPrice))
     {
       newPrice = newPrice * multiply;
     }
     return newPrice;
   }
Notepad++有一个插件,允许您创建快速Python脚本,以访问您的文档和Notepad++本身

中介绍了安装和设置

从那时起,API有了一些改进,现在用正则表达式替换了它

#启动一系列作为一个单元撤消和重做的操作。可能是嵌套的。
editor.beginUndoAction()
#相乘\u价格\u cdata
从十进制输入*
两位=十进制(10)**-2
def倍增\u价格\u cdata(m):
价格=十进制(m.group(2))*十进制(1.25)
返回m.group(1)+str(价格量化(两位))+m.group(3)
def cdata(m):
返回“CDATA”
#npp++搜索/替换
价格=r'()'
编辑器.重新替换(重新定价,乘以价格\U cdata)
#结束撤消序列
editor.endUndoAction()

正则表达式不能与数字相乘。但你们可以编写一个小程序,使用regexp查找所有的价格,乘法并替换它。谢谢你们,为我节省了时间(这将花费在搜索上)。对于像你这样的程序员来说,这可能是一件容易的事情,但对于像我这样的“用户”来说,这是一座山。如果(且仅当)这不是什么大事,我希望看到你所说的解决方案。向大家问好。您需要检查多少个文件,乘法是多少?每次都一样吗?如果我能得到更多的信息,我一定会为你做这件事的。我不会花太长时间,我只需要在我不工作的时候处理它。它只有一个文件(xml产品目录),价格需要乘以1.05(5%的利润率)。评论有点具体,脱离了问题的主题,所以如果你想通过我的邮箱给我发邮件,应该在我的个人资料中,我有几个最后的问题,我几乎在午餐时就完成了,我将在这里或git hub上发布源代码,以便其他人以后可以受益。谢谢你们两位。既然有人启动了引擎,我相信我会找到答案的。致以最诚挚的问候(kidpx,我找不到任何电子邮件地址)当价格有小数点时,脚本工作正常,例如“15.25”,但当价格没有小数点时,脚本不会影响价格;t没有十进制值,例如“15”。是否有一种方法可以将这两种类型相乘?是的,您可以指定正则表达式与
的可选匹配,或者添加逻辑or与管道
|
。我已经更新了答案以匹配这两种类型。您也可以使用\d{2}Thanx指定两位小数;看起来还好。
# Start a sequence of actions that is undone and redone as a unit. May be nested.
editor.beginUndoAction()

# multiply_price_cdata
from decimal import *
TWOPLACES = Decimal(10) ** -2 

def multiply_price_cdata( m ):
    price = Decimal( m.group(2) ) * Decimal( 1.25 )
    return  m.group(1) + str(price.quantize(TWOPLACES)) + m.group(3)

def cdata( m ):
    return "CDATA"

# npp++ search/replace
re_price = r'(<price><!\[CDATA\[)(\d+\.\d+|\d+)(\]\]></price>)'
editor.rereplace( re_price , multiply_price_cdata )

# end the undo sequence
editor.endUndoAction()