Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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 为什么[a-z][a-z]与[ą;-ž;][Ą;-Ž;]给出不同的结果?_Java_Regex_Utf 8 - Fatal编程技术网

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}”很有效,谢谢。