当前位置: 首页 > 知识库问答 >
问题:

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"

i、 e.所有前导零和尾随零将被删除,正/负零将仅为零。

我们可以通过首先拆分字符串并对每个部分使用Regex来实现这一点。但是我的字符串大小超过10000。
我们如何使用Regex实现这一点?

编辑:

答案分析:

我用字符串“0.00,-0.00,00.00,-00.00,40.00,-40.00,4.0,-4.0,4.01,-4.01,04.01,-04.01004.04,-004.04004.040,-0004.040101,-40,-.40,0.40,-0.40”测试了所有的测试用例。(见此处:https://regex101.com/r/tS8hE3/9)其他答案在大多数案例中都得到了通过,但不是全部。

共有3个答案

端木志诚
2023-03-14

更新以涵盖更多情况,如01 .10001.10

(?<=,|^)(?:[0.+-]+(?=0(?:,|\.\B|$))|0+(?=[1-9]))|\.0+\b|\b0+(?=\d*\.\b)|\.\B|(?<=[1-9])0+(?=,|$)

这种模式需要更多的回溯,因此在大输入时可能会变慢。Java字符串:

"(?<=,|^)(?:[0.+-]+(?=0(?:,|\\.\\B|$))|0+(?=[1-9]))|\\.0+\\b|\\b0+(?=\\d*\\.\\b)|\\.\\B|(?<=[1-9])0+(?=,|$)"

除了之前的模式这一个匹配

  • (?

在regex101或Regexplanet上演示(单击Java)

更新前回答
您也可以尝试将此正则表达式替换为空。

(?<=,|^)[0.+-]+(?=0(?:,|$))|\.0+\b|\b0+(?=\.)

>

  • (?

    |\.0\b或匹配一个句点,后跟一个或多个零和一个单词边界。

    |\b0(?=\) 或匹配一个边界,如果前面有一个周期,则后跟一个或多个零。

    0这样毫无疑问的案例011.10尚未包含在该模式中。作为Java字符串:

    "(?<=,|^)[0.+-]+(?=0(?:,|$))|\\.0+\\b|\\b0+(?=\\.)"
    

    在regex101或Regexplanet上演示(单击Java)

  • 子车高歌
    2023-03-14
    \.0+$|^(-)?0+(?=\.)
    

    你可以试试这个。如果你得到空字符串或替换后的-替换为0。见演示。

    https://regex101.com/r/cZ0sD2/7

    如果你想完全使用字符串

    -?0*\.0+\b|\.0+(?=,|$)|(?:^|(?<=,))(-)?0+(?=\.)
    

    见演示。

    https://regex101.com/r/cZ0sD2/16

    万阳嘉
    2023-03-14

    使用以下正则表达式:

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

    并替换为1美元2美元。看另一个演示。

    正则表达式匹配多个替代项,并捕获字符串的某些部分,以便在替换期间重新插入:

    • -?0\.(0)\b-匹配可选的-后面跟着一个或多个0s后面跟着一个.然后捕获一个0但是匹配一个或多个事件(因为(...)放置在0上,应用于此组);结尾处的单词边界要求在最后匹配的0之后出现非单词字符...在替换中,我们用1美元的反向引用恢复0。因此,-00.0000.00将替换为0
    • |-or...
    • \.0\b-一个点,在之前跟一个或多个零(因为字符串是逗号分隔的)。
    • |-or...
    • \b0(?=\.\d*[1-9])-一个单词边界(字符串的开头或之后的位置),后面跟着一个或多个0s,后面跟着。一个非0的数字(所以我们删除整数部分中的前导零,只包含零)
    • |-or...
    • \b0(?=[1-9]\d*\。)-一个单词边界,后面跟着一个或多个0,后面跟着一个非0数字。(所以,我们从不等于0 )。
    • |-or...
    • (\.\d*?)0\b-捕获一个零个或更多位数,但尽可能少,直到第一个0,然后只匹配一个或多个0(直到字符串或的末尾,>)(所以,我们摆脱了小数部分的尾随零)

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

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

    替换为$1

    请看regex演示。短视频演示:

    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

     类似资料:
    • 问题内容: 我有以下字符串作为输入: 最终输出将如下所示: 也就是说 ,将删除所有前导零和尾随零,并且正/负零都将简单地为零。 我们可以通过首先分割字符串并为每个部分使用Regex来实现。但是 我的字符串大小超过10000 。 我们怎样才能做到这一点呢? 编辑: 答案分析: 我已经用String测试了所有答案,并且 Wiktor Stribiewew的 答案通过了所有测试用例。(请参阅此处:htt

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

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

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

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

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