智能RegEx替换

时间:2013-10-09 22:06:38

标签: regex replace

我正在设置一个系统来解析具有非常指定语法的字符串并修复用户错误。例如,语法需要m / d / yy格式的日期(没有前导0),所以我需要进行以下替换:

  • 10/01/13 - > 13年10月1日
  • 10/10/13 - >没有变化
  • 10/1/13 - >没有变化
  • 01/10/13 - > 13年1月10日

我有很多这样的规则,我需要找到字符串的部分并修复这些部分。我可以使用RegEx来确定需要轻松纠正的内容。为了一个更简单的例子,我想找到CBUx[2-9],但是我需要替换像CBU x [2-9]之类的东西(如果前面是CBU并且后面跟着一个数字,那么x周围的空格)。例如:

输入文字:“blah blah CBUx3” 匹配:“CBUx3” 替换:“CBU x 3” 输出文字:“blah blah CBU x 3”

这可能吗?请注意,我完全清楚我可以编写代码来查找斜杠和数字。我特意尝试用“智能RegEx替换”来做到这一点。我有许多不同类型的更正,我可以与RegEx匹配,我想避免为每个更正编写具体的更正程序。

1 个答案:

答案 0 :(得分:0)

对于领先的零可能是类似的东西:

\b0+([1-9])

并替换为$1(或\1,具体取决于语言,但\1现在不太常见。)

但使用负面的背后隐藏可能会更好一些:

(?<![.,])\b0+([1-9])

因此0中的10,001.002不会更改为10,1.2

regex101 demo

单词边界\b确保0(或更多)位于数字的开头,负面的lookbehind是小数和千位分隔符的情况,假设你有在字符串中有浮点数。但请注意,这会阻止以11.01.13的日期格式删除零。然而,假设这样的日期总是在第二个点之后总是至少有一个数字(自2个数字之后,因为日期和月份最多需要2个数字),而不会遇到除了其他数字之外的任何其他数字,这可以做出更复杂的正则表达式。正则表达式看起来像......

(?<![.,](?![0-9]{2}\.[0-9]))\b0+([1-9])

它呈现类似this的内容。


对于CBUx[2-9],您也可以使用捕获组:

CBUx([2-9])

并替换为:CBU x $1(或\1


对于领先的零删除部分,我可能没有考虑过一些调整,但这就是我现在能想到的。