Android/Java Regex从子字符串中删除额外的零

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)大部分案例都通过了其他答案,但并非全部.

Wik*_*żew 3

更新了测试用例答案

使用以下正则表达式:

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- 匹配一个可选项-,后跟一个或多个0s,后跟 a .,然后精确捕获0一个但匹配一个或多个匹配项(因为 被(...)放置在 上0,并且+被应用于该组);末尾的单词边界要求在最后一个匹配的 后面出现一个非单词字符0。在替换中,我们0通过$1反向引用恢复。因此,-00.0000.00将被替换为0
  • |- 或者...
  • \.0+\b- a 之前有一个点,后面跟着一个或多个零,(因为字符串是用逗号分隔的)。
  • |- 或者...
  • \b0+(?=\.\d*[1-9])- 单词边界(字符串的开头或之后的位置,),后跟一个或多个0s,后跟.+ 零个或多个数字,后跟一个非 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

请参阅正则表达式演示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, "$1").equals(expected)); // TRUE
Run Code Online (Sandbox Code Playgroud)

解释

  • -0+\.(0)+\b- 减号后跟一个或多个0s ( 0+),后跟一个文字点 ( \.),后跟一个或多个零(并捕获最后一个0与 匹配的(0)+),后跟单词边界(,在此上下文中之前的位置)
  • |- 或者...
  • \.0+\b- 文字点 ( \.) 后跟一个或多个零,后跟单词边界(,在此上下文中之前的位置)
  • |- 或者...
  • \b0+(?=\.\d*[1-9])- 字边界(,在此上下文中位于后面的位置)后跟一个或多个零,这些零必须后跟一个文字点 ( \.),然后是零个或多个数字,然后是 1 到 9 范围内的数字(以便小数部分更多)比0)。