我的任务是从包含数字和一些文本的字符串中解析整数值。可以使用不同的区域设置格式化数字:
15 000 km
15,000 km
15.000 km
我有一个解决方案:
(\d+[[\s\.,]?\d+]*)
适用于上述示例。 但作为边缘情况,有一个特殊输入机智代码160而不是常规空间(代码32):
15 000 km
如何在java中使用正则表达式实现来解决这个问题?
摆弄它:http://java-regex-tester.appspot.com/regex/5d8dd002-fe68-40c3-bf82-42e8574a2f5c
理想情况下,我想要一个适用于任何不可打印字符的通用解决方案。
答案 0 :(得分:2)
您可以使用Pattern.UNICODE_CHARACTER_CLASS
标志来识别您的\s
Unicode:
String pattern = "(?U)\\d+[\\s.,]?\\d+";
^^^
请参阅Java demo:
String value1 = "15 000 km\n15,000 km\n15.000 km\n15 000 km";
String pattern1 = "(?U)\\d+[\\s.,]?\\d+";
Pattern ptrn = Pattern.compile(pattern1);
Matcher matcher = ptrn.matcher(value1);
while (matcher.find())
System.out.println(matcher.group(0));
输出:
15 000
15,000
15.000
15 000
答案 1 :(得分:1)
为什么不包含其他分隔符(\u00a0
)?
(\d+(?:[\s.,\u00a0]?\d+)*)
使用UNICODE_CHARACTER_CLASS
标志进行编译会使\s
匹配,但会发出警告:它可能会更慢;你必须进行测试,看看你的输入是否重要。
答案 2 :(得分:0)
你可以使用这个简单的正则表达式来匹配由0或更多非数字分隔的任何2个数字,即\D
:
\d+\D*\d+
在Java中:
String regex = "\\d+\\D*\\d+";
\D
将匹配任何非数字,包括任何unicode字符。