使用以下正则表达式:
String rx = "-?0+\.(0)+\b|\.0+\b|\b0+(?=\.\d*[1-9])|\b0+(?=[1-9]\d*\.)|(\.\d*?)0+\b";
并替换为
。参见另一个演示。regex匹配多种选择,并 捕获 字符串的某些部分,以便以后在替换期间重新插入:
-?0+.(0)+b
-匹配一个可选的选项,-
后跟一个或多个0
s.
,然后匹配一个,然后 捕获 恰好一个0
但匹配一个或多个出现的对象(因为将(...)
放在上0
并将+
应用于该组);最后的单词边界要求最后一个匹配项之后出现一个非单词字符0
。在替换中,我们0
使用反向引用还原。因此,-00.00
或00.00
将被替换0
。|
- 要么….0+b
-点后跟一个或多个零的点,
(因为字符串以逗号分隔)。|
- 要么…b0+(?=.d*[1-9])
-单词边界(字符串的开头或之后的位置,
),后跟一个或多个0
s,后跟.
+零个或多个数字,再跟非零数字(因此我们在仅包含零的整数部分中删除了前导零)|
- 要么…b0+(?=[1-9]d*.)
-字边界,后跟一个或多个零,后跟一个非零数字.
(因此,我们从不等于的整数部分中删除所有前导零0
)。|
- 要么…(.d*?)0+b
-捕获.
+零个或多个数字,但要尽可能少地捕获到第一个数字,0
然后才匹配一个或多个零(直到字符串或的末尾,
)(因此,我们去除了小数部分的尾随零)
我建议一个非常简单且简短的正则表达式来满足您的需求:
-0+.(0)+b|.0+b|b0+(?=.d*[1-9])
替换为
。请参阅regex演示。简短的IDEONE演示:
String re = "-0+\.(0)+\b|\.0+\b|\b0+(?=\.\d*[1-9])"; String str = "2.0,3.00,-4.0,0.00,-0.00,0.03,2.01,0.001,-0.03,101,0.001,-0.03";String expected = "2,3,-4,0,0,.03,2.01,.001,-.03,101,.001,-.03"; System.out.println(str.replaceAll(re, "").equals(expected)); // TRUE
说明 :
-0+.(0)+b
-减号后跟一个或多个0
s(0+
),然后是文字点(.
),然后是一个或多个零(并且仅捕获与0
匹配的最后一个(0)+
),再加上单词边界(,
在此上下文中位于之前)|
- 要么….0+b
-文字点(.
)后跟一个或多个零,后跟单词边界(,
在此上下文中,位于之前)|
- 要么…b0+(?=.d*[1-9])
-单词边界(,
在此上下文中位于后面),后跟一个或多个零, 后跟 一个文字点(.
),然后是零个或多个数字,然后是1到9范围内的一个数字(这样小数部分会更大)比0
)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)