正则表达式 - 不匹配某些字符和字符位置

时间:2017-07-25 19:58:45

标签: regex

解: 最后使用下面的Gary_W提供的正则表达式和使用讨论的替换函数的简单PowerShell命令解决了它。因此,我们不需要在我们使用的软件中使用内置的正则表达式活动。这是PS: “100,000.00”-replace“([,。] \ d {2} $)| [,。]”,“”

正则表达式吓坏了我。我不习惯那种逻辑。但是,我认为我目前的RE问题是一个非常简单的问题,我无法使其发挥作用:(

所以这就是我想要实现的目标: 我希望RE只匹配最后两位小数之前的数字。 因此,RE必须忽略任何“。”和“,”并且始终是最后两位数。

> Examples:
> 1.000.000,00 --> 1000000
> 123,456.00 --> 123456
> 100.000,00 --> 100000
> 10.000,00 --> 10000
> 10,000.00 --> 10000
> 1.000,00 --> 1000 
> 100,00 --> 100
> 99.88 --> 99 
> 99,88 --> 99 
> 1,23 --> 1 
> ...

任何想法如何使这个工作?

2 个答案:

答案 0 :(得分:1)

使用哪种语言/哪种工具?使用sed,您可以执行以下操作:

sed 's/\(.*\)[\.,]../\1/;s/[\.,]//g'

perl它类似,只是没有初始反斜杠:

perl -pe 's/(.*)[\.,]../\1/;s/[\.,]//g'

顺便说一句,这是通过两个正则表达式来完成的。第一个读取"保存所有可能的内容,直到一个点或一个逗号后跟两个字符,然后将整个匹配替换为#34;。第二个读取"用“#34”替换所有点和逗号,即"删除所有点和逗号"。

regexr.com中,您可以使用"替换"在工具中将匹配替换为第一个捕获组。只需将(.*)[\.,]..放入Expression,然后将$1放入Replace中,即可看到第一个正则表达式正常工作。然后你可以用第二个做类似的事情,因为正如我所看到的那样,正则表达式不支持表达式的链接。

答案 1 :(得分:1)

这是我在Oracle中如何做到的,因为它的价值。也许这里使用的正则表达式会给你一个想法。读取正则表达式为"在行尾找到逗号或小数后跟2位数的匹配,或逗号或小数,并替换为空。 注意最后可选小数位的匹配需要在正则表达式中首先匹配,否则首先匹配单个字符,使得2个小数位不存在,因此不匹配。

SQL> with tbl(str) as (
     select '1.000.000,00' from dual union all
     select '123,456.00' from dual union all
     select '100.000,00' from dual union all
     select '10.000,00' from dual union all
     select '10,000.00' from dual union all
     select '1.000,00' from dual union all
     select '100,00' from dual union all
     select '99.88' from dual union all
     select '99,88' from dual union all
     select '1,23' from dual union all
     select '3' from dual
   )
   select str,
          regexp_replace(str, '([,.]\d{2}$)|[,.]') fixed
   from tbl;

STR          FIXED
------------ ------------
1.000.000,00 1000000
123,456.00   123456
100.000,00   100000
10.000,00    10000
10,000.00    10000
1.000,00     1000
100,00       100
99.88        99
99,88        99
1,23         1
3            3

11 rows selected.

SQL>

刚看到regexr链接,插入我的正则表达式看起来就像使用全局标志一样。您要删除的字符会突出显示。