【问题标题】:Notepad++ or PowerGrep regex to find, multiply and replace a priceNotepad++ 或 PowerGrep 正则表达式来查找、乘法和替换价格
【发布时间】:2014-09-10 13:03:00
【问题描述】:

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

价格标签如下所示: <price><![CDATA[15.9]]></price>

操作后价格标签应如下所示: <price><![CDATA[19.875]]></price>

这可以在 Notepad++ 或 PowerGrep 中使用正则表达式完成吗?

提前致谢。

【问题讨论】:

  • 正则表达式不能乘以数字。但是你可以编写一个小程序,使用正则表达式来查找所有价格、乘以并替换它。

标签: regex replace notepad++ powergrep


【解决方案1】:

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

编辑:有一种更简单的方法可以做到这一点http://msdn.microsoft.com/en-us/library/hcebdtae(v=vs.110).aspx 这本质上就是您想要使用 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;
   }

【讨论】:

  • 谢谢你们,为我节省了时间(这将花费在搜索上)。对于像你这样的程序员来说,这可能是一件容易的事,但对于像我这样的“用户”来说,这是一座山。如果(且仅当)这没什么大不了的,我想看看你说的解决方案。向所有人致以最诚挚的问候。
  • 你需要检查多少个文件,乘以多少?每次都一样吗?如果我得到更多信息,我一定会为你做这件事,我不应该花太长时间,我只需要在我不工作的时候照顾它。
  • 只有一个文件(xml产品目录),价格需要乘以1.05(5%保证金)。
  • cmets 的问题有点具体而且离题了,所以如果你想通过我的电子邮件给我发电子邮件,该电子邮件应该在我的个人资料中,我有几个最后的问题,我几乎已经完成了午餐,我会在这里或在 git hub 上发布源代码,以便其他人以后可以受益。
  • 谢谢你们俩。既然有人已经启动了引擎,我相信我会弄清楚的。最好的问候(kidpx,我找不到任何电子邮件地址)
【解决方案2】:

Notepad++ 有一个Pythonscript 插件,可让您创建可以访问您的文档和 Notepad++ 本身的快速 Python 脚本。

this answer 中描述了安装和设置。

从那时起,API 发生了一些变化,您现在用Editor.rereplace 替换正则表达式。

# 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()

【讨论】:

  • 当价格为十进制值时,脚本可以正常工作,例如“15.25”,但不影响价格;没有十进制值,例如“15”。有没有办法将这两种类型相乘?
  • 是的,您可以指定正则表达式与? 的可选匹配,或者使用管道| 添加逻辑或。我已经更新了答案以匹配这两种类型。您也可以使用 \d{2} 指定两位小数
  • 谢谢;好像还好。
猜你喜欢
  • 2017-01-28
  • 2015-01-11
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多