【问题标题】:Case-insensitive string comparison in JuliaJulia 中不区分大小写的字符串比较
【发布时间】:2016-09-08 19:55:30
【问题描述】:

我确信这有一个简单的答案,但是如何在 Julia 中比较两个字符串并忽略大小写?我拼凑了一个相当不雅的解决方案:

function case_insensitive_match{S<:AbstractString}(a::S,b::S)
    lowercase(a) == lowercase(b)
end

一定有更好的办法!

【问题讨论】:

  • 其实它看起来是一个通用的方法,你会期待什么?
  • 如果您想要返回 -1、0 或 1 的更“类似 c”的字符串比较,请使用 cmp 而不是 ==。但除此之外,是的,这似乎是进行不区分大小写比较的最佳方式。一点都不优雅。
  • 字符串是一件很麻烦的事情。在比较字符串时,good 解决方案不会 a) 分配,b) 比较超出一阶差异。但最重要的是正确性(以及坚持所需迂腐水平的灵活性)。是的,即使正确性也很难定义,字符串很乱,但这对程序员和 Julia 来说是重要

标签: string julia


【解决方案1】:

效率问题

您选择的方法确实适用于大多数设置。如果您正在寻找更有效的东西,那么您不太可能找到它。原因是大写字母与小写字母以不同的位编码存储。因此,在比较字符串中的字符时,您可以忽略字符对象的某些大写字段。幸运的是,大写字母与小写字母之间的位数差异非常小,因此转换简单高效。有关这方面的背景信息,请参阅此 SO 帖子:

How do uppercase and lowercase letters differ by only one bit?

准确性问题

在大多数情况下,您使用的方法都可以正常工作。但是,如果您遇到诸如大写字母与小写希腊字母之类的字符,它可能会失败。为此,您最好使用normalize 函数(有关详细信息,请参阅docs)和casefold 选项:

normalize("ad", casefold=true)

在 Python 的上下文中查看此 SO 帖子,它解决了此处的相关问题,因此无需重复:

How do I do a case-insensitive string comparison?

由于它讨论的是 utf 编码的潜在问题,因此它适用于 Julia 以及 Python。

有关其他背景和 lowercase() 可能失败的地方的具体示例,另请参阅此 Julia Github 讨论:

https://github.com/JuliaLang/julia/issues/7848

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2021-05-09
    • 2015-07-23
    • 2012-11-30
    • 1970-01-01
    相关资源
    最近更新 更多