- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有以下字符串作为输入:
"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"
即所有前导零和尾随零都将被删除,正/负零都将简单地为零。
我们可以通过首先拆分字符串并对每个部分使用正则表达式来实现这一点。但是我的字符串大小超过 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 Stribiż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";
并替换为 $1$2
。参见 another demo .
正则表达式匹配多个备选方案并捕获字符串的某些部分以便稍后在替换期间重新插入:
-?0+\.(0)+\b
- 匹配可选的 -
后跟一个或多个 0
后跟一个 .
然后 捕获 正好是一个 0
但匹配一次或多次出现(因为 (...)
放在 0
上,+
应用于该组);最后的单词边界要求在最后匹配的 0
之后出现一个非单词字符。在替换中,我们使用 $1
反向引用恢复 0
。因此,-00.00
或 00.00
将替换为 0
。|
- 或者...\.0+\b
- 在 ,
之前一个点后跟一个或多个零(因为字符串是逗号分隔的)。|
- 或者...\b0+(?=\.\d*[1-9])
- 单词边界(字符串的开头或 ,
之后的位置)后跟一个或多个 0
后跟 .
+ 零个或多个数字后跟一个非 0 数字(因此我们删除仅由零组成的整数部分中的前导零)|
- 或者...\b0+(?=[1-9]\d*\.)
- 单词边界后跟一个或多个零,然后是 之前的非 0 数字。
(因此,我们从不等于 0
的整数部分中删除所有前导零)。|
- 或者...(\.\d*?)0+\b
- 捕获 .
+ 零个或多个数字,但尽可能少,直到第一个 0
,然后只匹配一个或多个零(直到字符串或 ,
的末尾)(因此,我们去掉了小数部分的尾随零)我建议使用一个非常简单和简短的正则表达式来满足您的需要:
-0+\.(0)+\b|\.0+\b|\b0+(?=\.\d*[1-9])
替换为$1
。
参见 regex demo .短IDEONE demo :
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
(0+
)带有文字点 (\.
) 后跟一个或多个零(并仅捕获与 (0)+
匹配的最后一个 0
)带有单词边界(在此上下文中位于 ,
之前)|
- 或者...\.0+\b
- 一个文字点 (\.
) 后跟一个或多个零,然后是单词边界(位置在 之前,
在这种情况下)|
- 或者...\b0+(?=\.\d*[1-9])
- 单词边界(在此上下文中位于 ,
之后)后跟一个或多个零,后面必须跟一个文字点 (\.
),然后是零个或多个数字,然后是 1 到 9 范围内的数字(以便小数部分更比 0
)。关于java - Android/Java 正则表达式从子字符串中删除多余的零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34985710/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!