当前位置: 首页 > 面试题库 >

Android / Java正则表达式从子字符串中删除多余的零

宰父远
2023-03-14
问题内容

我有以下字符串作为输入:

"2.0,3.00,-4.0,0.00,-0.00,0.03,2.01,0.001,-0.03,101"

最终输出将如下所示:

"2,3,-4,0,0,.03,2.01,.001,-.03,101"

也就是说 ,将删除所有前导零和尾随零,并且正/负零都将简单地为零。

我们可以通过首先分割字符串并为每个部分使用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"并且
Wiktor Stribiewew的
答案通过了所有测试用例。(请参阅此处:https :
**_//regex101.com/r/tS8hE3/9_** )大多数情况下都通过了其他答案,但并非全部。


问题答案:

使用以下正则表达式:

String rx = "-?0+\\.(0)+\\b|\\.0+\\b|\\b0+(?=\\.\\d*[1-9])|\\b0+(?=[1-9]\\d*\\.)|(\\.\\d*?)0+\\b";

并替换为$1$2。参见另一个演示。

regex匹配多种选择,并 捕获 字符串的某些部分,以便以后在替换期间重新插入:

  • -?0+\.(0)+\b-匹配一个可选的选项,-后跟一个或多个0s .,然后匹配一个,然后 捕获 恰好一个0但匹配一个或多个出现的对象(因为将(...)放在上0并将+应用于该组);最后的单词边界要求最后一个匹配项之后出现一个非单词字符0。在替换中,我们0使用$1反向引用还原。因此,-00.0000.00将被替换0
  • | - 要么…
  • \.0+\b-点后跟一个或多个零的点,(因为字符串以逗号分隔)。
  • | - 要么…
  • \b0+(?=\.\d*[1-9])-单词边界(字符串的开头或之后的位置,),后跟一个或多个0s,后跟.+零个或多个数字,再跟非零数字(因此我们在仅包含零的整数部分中删除了前导零)
  • | - 要么…
  • \b0+(?=[1-9]\d*\.)-字边界,后跟一个或多个零,后跟一个非零数字.(因此,我们从不等于的整数部分中删除所有前导零0)。
  • | - 要么…
  • (\.\d*?)0+\b-捕获.+零个或多个数字,但要尽可能少地捕获到第一个数字,0然后才匹配一个或多个零(直到字符串或的末尾,)(因此,我们去除了小数部分的尾随零)

在测试用例更新之前回答

我建议一个非常简单且简短的正则表达式来满足您的需求:

-0+\.(0)+\b|\.0+\b|\b0+(?=\.\d*[1-9])

替换为$1

请参阅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, "$1").equals(expected)); // TRUE

说明

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


 类似资料:
  • 我有以下字符串作为输入: 最终输出将是这样的: i、 e.所有前导零和尾随零将被删除,正/负零将仅为零。 我们可以通过首先拆分字符串并对每个部分使用Regex来实现这一点。但是我的字符串大小超过10000。 我们如何使用实现这一点? 编辑: 答案分析: 我用字符串测试了所有的测试用例。(见此处:https://regex101.com/r/tS8hE3/9)其他答案在大多数案例中都得到了通过,但不

  • 我有一个文本文件,其中包含以下内容:鲍勃去“商店”商店“买牛奶”买牛奶。 我想删除string1中所有引用的内容,使其只包含:Bob去商店买牛奶。 有没有一种不用正则表达式就能做到这一点的方法?我目前正在尝试使用split()方法。我首先使用split()将文本文件读入名为string1的字符串变量,然后将值存储回名为newString的新字符串中。 我对java非常陌生,不确定是否正确使用了sp

  • 问题内容: 如何在Java中从给定的字符串中删除所有方括号(“ []”)? 在这种情况下将使用什么正则表达式? 问题答案: 使用这个:

  • 问题内容: 我有两个弦 和。现在,我想对这些字符串应用一个正则表达式,以过滤掉除数字以外的所有内容,以便获得像和这样的整数。 我该怎么做? 问题答案: 您可以使用。它会考虑您所拥有的一切之外的一切。 因此,如果要过滤除y以外的所有内容。在你的情况下,你会做类似的事情 其中string是保存实际文本的变量!

  • 问题内容: 我有这个作业问题,需要使用正则表达式删除字符串中的所有其他字符。 在一部分中,我必须删除索引1,3,5,…处的字符,具体操作如下: 这是我想要的打印。本质上,我一次匹配两个字符,然后替换为第一个字符。我使用组捕获来做到这一点。 问题是,我在作业的第二部分遇到麻烦,我需要删除索引0、2、4,…处的字符。 我已经完成以下工作: 此打印,但正确答案必须是。仅当输入字符串的长度为奇数时,我的正

  • 我们需要使用C#中的Regex. Replace()从电话号码中删除字符。允许的字符是(仅第一个字符)和[0-9]。应该过滤其他任何内容。 替换所有非数字的内容很好,但是我们怎么能只允许on作为第一个字符呢? 我们的正则表达式: 在这个数字上:它会删除空格和连字符,但不会删除23前面的。 知道如何解决这个问题吗?