为什么[a-z] [A-Z]给出[[-ž] [Ą-Ž]不同的结果?

时间:2017-07-31 04:58:51

标签: java regex utf-8

我正在尝试将文本拆分为小写字母后跟大写字母。

让我们说文字是:

"Įvairių rūšiųSkinti kardeliai"

我想把它拆分为“ųS”,但是下面的正则表达式“[ą-ž] [Ą-Ž]”给了我:

"Įvairių r"

但是当我将我的母语字母和正则表达式更改为“[a-z] [A-Z]”时

"Ivairiu rusiuSkinti kardeliai"

我得到了预期的结果:

"Ivairiu rusi"

2 个答案:

答案 0 :(得分:4)

[a-z]表示“匹配a到z的字符”,对吧?我们作为人类倾向于认为显然b在a之后,c在b之后...等等所以a-z将覆盖所有小写字母。

然而,实际发生的是a-z匹配az之间的任何Unicode代码点,其中碰巧是所有小写字母

让我们看看±和ž之间的代码点。

ąĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽž

[ą-ž]将匹配以上任何字符!这不是你想要的,是吗?

要解决此问题,您可以

  • 键入所有小写字母并将其放入[]。对大写的一样做,或者;
  • 使用字符类,例如\p{Lu}表示大写,\p{Ll}表示小写。

答案 1 :(得分:2)

[Ą-Ž]包括š

for (char c = 'Ą'; c <= 'Ž'; ++c)
    System.out.print(c);

结果:

ĄąĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽ

[A-Z]不包含s

for (char c = 'A'; c <= 'Z'; ++c)
    System.out.print(c);

结果:

ABCDEFGHIJKLMNOPQRSTUVWXYZ