我有以下字符串作为输入:
"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)其他答案在大多数案例中都得到了通过,但不是全部。
更新以涵盖更多情况,如01
,
.100
,01.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这样毫无疑问的案例
、01
、1.10
尚未包含在该模式中。作为Java字符串:
"(?<=,|^)[0.+-]+(?=0(?:,|$))|\\.0+\\b|\\b0+(?=\\.)"
在regex101或Regexplanet上演示(单击Java)
\.0+$|^(-)?0+(?=\.)
你可以试试这个。如果你得到空字符串或替换后的-
替换为0
。见演示。
https://regex101.com/r/cZ0sD2/7
如果你想完全使用字符串
-?0*\.0+\b|\.0+(?=,|$)|(?:^|(?<=,))(-)?0+(?=\.)
见演示。
https://regex101.com/r/cZ0sD2/16
使用以下正则表达式:
String rx = "-?0+\\.(0)+\\b|\\.0+\\b|\\b0+(?=\\.\\d*[1-9])|\\b0+(?=[1-9]\\d*\\.)|(\\.\\d*?)0+\\b";
并替换为1美元2美元
。看另一个演示。
正则表达式匹配多个替代项,并捕获字符串的某些部分,以便在替换期间重新插入:
-?0\.(0)\b
-匹配可选的-
后面跟着一个或多个0
s后面跟着一个.
然后捕获一个0
但是匹配一个或多个事件(因为(...)
放置在0
上,
应用于此组);结尾处的单词边界要求在最后匹配的0
之后出现非单词字符...在替换中,我们用1美元的反向引用恢复0
。因此,-00.00
或00.00
将替换为0
。 |
-or...\.0\b
-一个点,在,
之前跟一个或多个零(因为字符串是逗号分隔的)。 |
-or...\b0(?=\.\d*[1-9])
-一个单词边界(字符串的开头或,
之后的位置),后面跟着一个或多个0
s,后面跟着。一个非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
-一个负号,后跟一个或多个0
s(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前面的。 知道如何解决这个问题吗?