【问题标题】:Convert float seconds to milliseconds using regex with Notepad++使用正则表达式和 Notepad++ 将浮点秒转换为毫秒
【发布时间】:2021-04-25 18:02:23
【问题描述】:

我想使用正则表达式和 Notepad++ 将 XML 标记中包含的所有秒数转换为毫秒。

转换前:

<keepTime>3</keepTime>
<keepTime>4.5</keepTime>
<keepTime>0.7</keepTime>
<keepTime>1.85</keepTime>

转换后我想要的结果:

<keepTime>3000</keepTime>
<keepTime>4500</keepTime>
<keepTime>700</keepTime>
<keepTime>1850</keepTime>

这是我使用的正则表达式:&lt;keepTime&gt;([0-9]*[.])?[0-9]+&lt;/keepTime&gt;

它匹配&lt;keepTime&gt; 中的所有值。但是,我不知道将什么替换为毫秒。

如果您的回答对您有帮助,我将不胜感激。

谢谢。

【问题讨论】:

  • 您需要在多个文件中搜索和替换,还是只需要一个文件?我建议使用基于 PythonScript 的解决方案,这将是最容易实现的。正则表达式将不可读。
  • 是否还有格式为 0.0000007 或 9999.853456 的值?
  • @WiktorStribiżew 我遵循了下面的解决方案,它非常简单且安全。但最重要的是,它给了我所提问题的正确结果。
  • @Thefourthbird 是的,我使用的是 Notepad++ v7.8.6,并且其上的 RE 匹配这些值。但是,我的文件没有这么小/这么大的值。
  • 那是几个不覆盖all cases的正则表达式的组合。

标签: regex xml notepad++ milliseconds seconds


【解决方案1】:

即使我经常使用正则表达式 (RE),我也不愿意在这项工作中使用一个复杂的正则表达式。它错过某些标签或错误转换其他标签的可能性似乎太高且风险太大。我会使用一系列简单的 RE 来完成这类任务,它们共同让我相信我已经正确地完成了所有更改。

因此,选择“正则表达式”和“环绕”:

&lt;keepTime&gt;(\d+)&lt;/keepTime&gt; 更改为&lt;done&gt;${1}000&lt;/done&gt;

&lt;keepTime&gt;(\d+)\.(\d)&lt;/keepTime&gt; 更改为&lt;done&gt;${1}${2}00&lt;/done&gt;

&lt;keepTime&gt;(\d+)\.(\d\d)&lt;/keepTime&gt; 更改为&lt;done&gt;${1}${2}0&lt;/done&gt;

要删除所有前导零但保留单个零,请使用

&lt;done&gt;0+([1-9]\d*)&lt;/done&gt; 更改为&lt;done&gt;${1}&lt;/done&gt;

对于上述内容的变体以删除一些前导零但保留三位数字,请使用:

&lt;done&gt;0+(\d\d\d)&lt;/done&gt; 更改为&lt;done&gt;${1}&lt;/done&gt;

修改为保留两位或四位等很简单。

现在搜索&lt;/?keepTime&gt; 的任何剩余匹配项,并以上述样式更改它们。然后当它们全部更改时,将“完成”转换为:

&lt;done&gt;(\d+)&lt;/done&gt; 更改为&lt;keepTime&gt;\1&lt;/keepTime&gt;

现在做一个最后的检查,所有的“完成”都已经完成,搜索&lt;/?done&gt;

请注意,done 应始终替换为原始文件中未使用的某些标记。另请注意,这是复杂的编辑,因此请在进行更改之前进行备份。

【讨论】:

  • 您的替换似乎不准确。我在你写的时候使用,我得到的结果是:&lt;done&gt;{1}000&lt;/done&gt;。但是我将替换字段编辑为:&lt;keepTime&gt;\1000&lt;/keepTime&gt;(删除大括号和反斜杠)然后我得到的结果与问题中的完全一样。但无论如何,你的解决方案奏效了。没有出错(因此您可以对自己编写的 RE 感到安全)。
  • @TầnQuảng 抱歉,\{1} 等应该是 ${1} 等。需要花括号,因为\1000$1000 等可以引用千分之一捕获组,不捕获第一组,后跟000。答案已更新。
  • 一个问题是它不会删除数字小于 1 的前导零(例如:0.7 会变成 0700 而不是 700;或者 0.01 会变成 0010 而不是 10)。你有解决办法吗?
【解决方案2】:

使用正则表达式进行数字乘法感觉就像试图用螺丝刀钉钉子一样,我当然不会在单个 replace() 调用中尝试它,但如果允许你使用一些条件逻辑,那么它不是太难了:

(a) if there's no ".", append "000"
(b) otherwise:
   (i) append "000"
   (ii) replace ".xxx" by "xxx."
   (iii) delete trailing zeroes
   (iv) delete trailing "."

【讨论】:

    猜你喜欢
    • 2011-06-02
    • 2017-10-09
    • 1970-01-01
    • 2013-07-11
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多