【问题标题】:Find if codepoint is upper case in Elixir在 Elixir 中查找代码点是否为大写
【发布时间】:2016-05-01 22:06:03
【问题描述】:

我需要检测代码点是否是 Elixir 中的大写字母。我试过检查它的值是否在65..90 范围内,但这在非拉丁大写字母上失败。我也试过检查是否

String.upcase(cp) == cp

但是,这在非字母(即数字、标点符号)上失败。

我真的不想遍历整个 unicode 并创建大写代码点列表,是否有内置函数?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    您可以使用\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 proposal to add functionality like this to the Elixir standard library,尽管它可能会被添加到单独的 Hex 包中,因为 Unicode 库已经非常大了。
    • 这在多行字符串上失败("A\na" 将被匹配为大写字母,尽管它不太可能如此。)请更正它以使用 \A\z 终止符,谢谢。
    【解决方案2】:

    我认为你可以使用这样的东西:

    << *CODEPOINT* :: utf8 >> != String.downcase(<< *CODEPOINT* :: utf8 >>)
    

    也许有更好的方法,但这只是开始。

    【讨论】:

    • 是否有条款保护安全的方法来确定字符大小写?
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多