处理 Java 正则表达式中的 unicode 符号

Handling unicode symbols in Java regex

我的任务是从带有数字和一些文本的字符串中解析整数值。数字可以使用不同的语言环境进行格式化:

15 000 km
15,000 km
15.000 km

我有一个解决方案:

(\d+[[\s\.,]?\d+]*)

适用于上述示例。 但作为边缘情况,有一个特殊的输入机智代码 160 而不是常规 space(代码 32):

15 000 km

如何使用 java 中的正则表达式实现来解决这个问题?

Fiddle 出来:http://java-regex-tester.appspot.com/regex/5d8dd002-fe68-40c3-bf82-42e8574a2f5c

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

您可以使用 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

您可以使用这个简单的正则表达式来匹配由 0 个或多个非数字分隔的任何 2 个数字,即 \D:

\d+\D*\d+

在Java中:

String regex = "\d+\D*\d+";

\D 将匹配任何非数字,包括任何 unicode 字符。

Your Updated Demo

为什么不包含额外的分隔符 (\u00a0)?

(\d+(?:[\s.,\u00a0]?\d+)*)

使用 UNICODE_CHARACTER_CLASS 标志编译将使 \s 匹配,但有一个警告,它可能会更慢;您必须测试一下它对您的输入是否重要。