在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+";