【问题标题】:Why does [a-z][A-Z] give different results from [ą-ž][Ą-Ž]?为什么 [a-z][A-Z] 给出的结果与 [ą-ž][Ą-Ž] 不同?
【发布时间】:2018-01-06 13:05:12
【问题描述】:

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

假设文本是:

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

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

"Įvairių r"

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

"Ivairiu rusiuSkinti kardeliai"

我得到了预期的结果:

"Ivairiu rusi"

【问题讨论】:

  • 我会选择字符类,所以你只需要说“小写后跟大写”,只要正则表达式引擎正确处理它们(我会假设 Java 会这样)。例如,由于 Unicode 点范围 ą-ž 不包括 a-z,因此它与常规拉丁字母不匹配
  • 添加您正在使用的实际代码将使回答问题更容易

标签: java regex utf-8


【解决方案1】:

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

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

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

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

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

要解决这个问题,您可以

  • 键入所有小写字母并将它们放入[]。对大写字母执行相同操作,或者;
  • 使用字符类,例如 \p{Lu} 用于大写,\p{Ll} 用于小写。

【讨论】:

  • 将表达式更改为 "(\p{Ll}\p{Lu})" 并且可以正常工作。谢谢。
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多