【发布时间】:2016-05-01 22:06:03
【问题描述】:
我需要检测代码点是否是 Elixir 中的大写字母。我试过检查它的值是否在65..90 范围内,但这在非拉丁大写字母上失败。我也试过检查是否
String.upcase(cp) == cp
但是,这在非字母(即数字、标点符号)上失败。
我真的不想遍历整个 unicode 并创建大写代码点列表,是否有内置函数?
【问题讨论】:
标签: elixir
我需要检测代码点是否是 Elixir 中的大写字母。我试过检查它的值是否在65..90 范围内,但这在非拉丁大写字母上失败。我也试过检查是否
String.upcase(cp) == cp
但是,这在非字母(即数字、标点符号)上失败。
我真的不想遍历整个 unicode 并创建大写代码点列表,是否有内置函数?
【问题讨论】:
标签: elixir
您可以使用\p{Lu} Unicode 字符属性正则表达式转义序列来匹配任何大写字母:
iex(1)> "a" =~ ~r/^\p{Lu}$/u
false
iex(2)> "A" =~ ~r/^\p{Lu}$/u
true
iex(3)> "π" =~ ~r/^\p{Lu}$/u
false
iex(4)> "Π" =~ ~r/^\p{Lu}$/u
true
iex(5)> "!" =~ ~r/^\p{Lu}$/u
false
确保传递u 标志以在正则表达式中打开Unicode 匹配。
您可以在this 页面上找到有关受支持属性的更多信息。在页面上搜索标题“Unicode 字符属性”。
【讨论】:
"A\na" 将被匹配为大写字母,尽管它不太可能如此。)请更正它以使用 \A 和 \z 终止符,谢谢。
我认为你可以使用这样的东西:
<< *CODEPOINT* :: utf8 >> != String.downcase(<< *CODEPOINT* :: utf8 >>)
也许有更好的方法,但这只是开始。
【讨论】: