cod*_*lor 12 java regex string android
我有以下字符串作为输入:
"2.0,3.00,-4.0,0.00,-0.00,0.03,2.01,0.001,-0.03,101"
Run Code Online (Sandbox Code Playgroud)
最终输出将如下:
"2,3,-4,0,0,.03,2.01,.001,-.03,101"
Run Code Online (Sandbox Code Playgroud)
即所有前导和尾随零将被删除,正/负零点将会更加简单为零.
我们可以通过首先拆分字符串并为每个部分使用Regex来实现这一点.但我的字符串大小超过10000.
我们怎样才能实现这个目标Regex
?
编辑:
答案分析:
我用String测试了所有答案,"0.00,-0.00,00.00,-00.00,40.00,-40.00,4.0,-4.0,4.01,-4.01,04.01,-04.01,004.04,-004.04,0004.040,-0004.040,101,.40,-.40,0.40,-0.40"
并且WiktorStribiżew的答案通过了所有的测试用例.(见这里:https://regex101.com/r/tS8hE3/9)大部分案例都通过了其他答案,但并非全部.
使用以下正则表达式:
String rx = "-?0+\\.(0)+\\b|\\.0+\\b|\\b0+(?=\\.\\d*[1-9])|\\b0+(?=[1-9]\\d*\\.)|(\\.\\d*?)0+\\b";
Run Code Online (Sandbox Code Playgroud)
并替换为$1$2
. 查看另一个演示。
正则表达式匹配多个替代项并捕获字符串的某些部分,以便稍后在替换期间重新插入:
-?0+\.(0)+\b
- 匹配一个可选项-
,后跟一个或多个0
s,后跟 a .
,然后精确捕获0
一个但匹配一个或多个匹配项(因为 被(...)
放置在 上0
,并且+
被应用于该组);末尾的单词边界要求在最后一个匹配的 后面出现一个非单词字符0
。在替换中,我们0
通过$1
反向引用恢复。因此,-00.00
或00.00
将被替换为0
。|
- 或者...\.0+\b
- a 之前有一个点,后面跟着一个或多个零,
(因为字符串是用逗号分隔的)。|
- 或者...\b0+(?=\.\d*[1-9])
- 单词边界(字符串的开头或之后的位置,
),后跟一个或多个0
s,后跟.
+ 零个或多个数字,后跟一个非 0 数字(因此我们删除仅由零组成的整数部分中的前导零)|
- 或者...\b0+(?=[1-9]\d*\.)
- 字边界,后跟一个或多个零,后跟 a 之前的非 0 数字.
(因此,我们从不等于 的整数部分中删除所有前导零0
)。|
- 或者...(\.\d*?)0+\b
- 捕获.
+零个或多个数字,但尽可能少,直到第一个0
,然后只匹配一个或多个零(直到字符串或的末尾,
)(因此,我们去掉小数部分中的尾随零)我建议使用一个非常简单且简短的正则表达式来满足您的需要:
-0+\.(0)+\b|\.0+\b|\b0+(?=\.\d*[1-9])
Run Code Online (Sandbox Code Playgroud)
用。。。来代替$1
。
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, "$1").equals(expected)); // TRUE
Run Code Online (Sandbox Code Playgroud)
解释:
-0+\.(0)+\b
- 减号后跟一个或多个0
s ( 0+
),后跟一个文字点 ( \.
),后跟一个或多个零(并捕获最后一个0
与 匹配的(0)+
),后跟单词边界(,
在此上下文中之前的位置)|
- 或者...\.0+\b
- 文字点 ( \.
) 后跟一个或多个零,后跟单词边界(,
在此上下文中之前的位置)|
- 或者...\b0+(?=\.\d*[1-9])
- 字边界(,
在此上下文中位于后面的位置)后跟一个或多个零,这些零必须后跟一个文字点 ( \.
),然后是零个或多个数字,然后是 1 到 9 范围内的数字(以便小数部分更多)比0
)。 归档时间: |
|
查看次数: |
394 次 |
最近记录: |