Java 为什么[a-z][a-z]与[ą;-ž;][Ą;-Ž;]给出不同的结果?
我正在尝试拆分文本,其中有一个小写字母后跟一个大写字母 假设文本是:Java 为什么[a-z][a-z]与[ą;-ž;][Ą;-Ž;]给出不同的结果?,java,regex,utf-8,Java,Regex,Utf 8,我正在尝试拆分文本,其中有一个小写字母后跟一个大写字母 假设文本是: “瓦伊里·雷什伊斯金蒂·卡德利莱” 我想在“ųS”处拆分它,但下面的正则表达式“[ą-ž][Ą-Ž]”给了我: “瓦伊里” 但是当我把我的母语字母和正则表达式改为“[a-z][a-z]” “Ivairiu rusiuSkinti kardeliai” 我得到了预期的结果: “Ivairiu rusi”[Ą-Ž]包括 for (char c = 'Ą'; c <= 'Ž'; ++c) System.out.prin
“瓦伊里·雷什伊斯金蒂·卡德利莱”
我想在“ųS”处拆分它,但下面的正则表达式“[ą-ž][Ą-Ž]”给了我:
“瓦伊里”
但是当我把我的母语字母和正则表达式改为“[a-z][a-z]”
“Ivairiu rusiuSkinti kardeliai”
我得到了预期的结果:
“Ivairiu rusi”
[Ą-Ž]
包括
for (char c = 'Ą'; c <= 'Ž'; ++c)
System.out.print(c);
但是[A-Z]
不包括s
for (char c = 'A'; c <= 'Z'; ++c)
System.out.print(c);
[Ą-Ž]
包括
for (char c = 'Ą'; c <= 'Ž'; ++c)
System.out.print(c);
但是[A-Z]
不包括s
for (char c = 'A'; c <= 'Z'; ++c)
System.out.print(c);
[a-z]
的意思是“从a到z匹配一个字符”,对吗?我们人类倾向于认为b在a之后,c在b之后。。。等等,所以a-z将覆盖所有小写字母
然而,实际发生的是a-z
匹配a
和z
之间的任何Unicode代码点,这恰好是所有小写字母
让我们看看ą和ą之间的代码点
ąĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽž
[ą-ž]
将匹配上述任何字符!那不是你想要的,是吗
要解决这个问题,您可以
- 键入所有小写字母并将其放入
[]
中。对大写字母执行相同的操作,或李>
- 使用字符类,如
\p{Lu}
表示大写,\p{Ll}
表示小写
[a-z]
的意思是“从a到z匹配一个字符”,对吗?我们人类倾向于认为b在a之后,c在b之后。。。等等,所以a-z将覆盖所有小写字母
然而,实际发生的是a-z
匹配a
和z
之间的任何Unicode代码点,这恰好是所有小写字母
让我们看看ą和ą之间的代码点
ąĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽž
[ą-ž]
将匹配上述任何字符!那不是你想要的,是吗
要解决这个问题,您可以
- 键入所有小写字母并将其放入
[]
中。对大写字母执行相同的操作,或李>
- 使用字符类,如
\p{Lu}
表示大写,\p{Ll}
表示小写
我会选择字符类,因此您只需要说“小写后大写”,只要regexp引擎正确地传递它们(我假设Java也是这样)。例如,由于Unicode指出范围ą-ž不包括a-z,因此它与常规拉丁字母不匹配。添加您正在使用的实际代码将使回答问题更容易。我会选择字符类,因此您只需要说“小写后跟大写”,前提是regexp引擎正确地传递了它们例如,由于Unicode指向的范围ą-ž不包括a-z,因此它与常规拉丁字母不匹配。添加您正在使用的实际代码将使回答问题变得更容易。将表达式更改为“(\p{Ll}\p{Lu})”,它可以工作。谢谢。将表达式更改为“(\p{Ll}\p{Lu Lu}”很有效,谢谢。