Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java正则表达式中处理unicode符号_Java_Regex_Parsing_Regex Greedy - Fatal编程技术网

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

在Java正则表达式中处理unicode符号,java,regex,parsing,regex-greedy,Java,Regex,Parsing,Regex Greedy,我的任务是从带有数字和一些文本的字符串中解析整数值。可以使用不同的地区设置数字的格式: 15 000 km 15,000 km 15.000 km 我有一个解决办法: (\d+[[\s\.,]?\d+]*) 适用于以上示例。 但作为边缘情况,有一个特殊的输入,代码为160,而不是规则空间(代码32): 如何使用java中的正则表达式实现来解决这个问题 摆弄它: 理想情况下,我想要一个通用的解决方案,它可以处理任何不可打印的字符。您可以使用模式.UNICODE\u character\u CL

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

15 000 km
15,000 km
15.000 km
我有一个解决办法:

(\d+[[\s\.,]?\d+]*)
适用于以上示例。 但作为边缘情况,有一个特殊的输入,代码为160,而不是规则空间(代码32):

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

摆弄它:


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

您可以使用
模式.UNICODE\u character\u CLASS
标志,使您的
\s
能够识别UNICODE:

String pattern = "(?U)\\d+[\\s.,]?\\d+";
                  ^^^
见:

输出:

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\u CHARACTER\u CLASS
标志编译将使
\s
匹配,但警告可能会更慢;您必须测试它对您的输入是否重要。

ASCII代码160是一个带有尖锐口音的a。不知道你是怎么收到的。你知道解析输入时的语言环境吗?如果是的话,您可以使用不同的方法,而不是一个catch-all正则表达式。例如,您可以使用strategy模式并为该区域的特定语法使用解析器。如果您有硬空格,只需确保您使用的是Unicode感知的
\s
。查看在没有
模式的情况下使用
\s
的位置。UNICODE\u CHARACTER\u CLASS
标志。像
(\d+[\s,\xA0]?\d+)
这样简单的东西如何使用
(\d+[\s,\xA0]?\d+)
我考虑过这种解决方案,但这对15公里15公里15 000公里不起作用
\d+\D*\d+
String regex = "\\d+\\D*\\d+";