处理Java正则表达式

时间:2016-09-13 19:30:01

标签: java regex parsing regex-greedy

我的任务是从包含数字和一些文本的字符串中解析整数值。可以使用不同的区域设置格式化数字:

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

理想情况下,我想要一个适用于任何不可打印字符的通用解决方案。

3 个答案:

答案 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字符。

Your Updated Demo