处理 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 字符。
为什么不包含额外的分隔符 (\u00a0
)?
(\d+(?:[\s.,\u00a0]?\d+)*)
使用 UNICODE_CHARACTER_CLASS
标志编译将使 \s
匹配,但有一个警告,它可能会更慢;您必须测试一下它对您的输入是否重要。
我的任务是从带有数字和一些文本的字符串中解析整数值。数字可以使用不同的语言环境进行格式化:
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 字符。
为什么不包含额外的分隔符 (\u00a0
)?
(\d+(?:[\s.,\u00a0]?\d+)*)
使用 UNICODE_CHARACTER_CLASS
标志编译将使 \s
匹配,但有一个警告,它可能会更慢;您必须测试一下它对您的输入是否重要。