【问题标题】:Ruby: how to check if an UTF-8 string contains only letters and numbers?Ruby:如何检查 UTF-8 字符串是否只包含字母和数字?
【发布时间】:2011-01-31 22:20:08
【问题描述】:

我有一个 UTF-8 字符串,可以是任何语言。

如果它不包含任何非字母数字字符,我该如何检查?

我在 UnicodeUtils Ruby gem 中找不到这样的方法。

例子:

  1. ėččę91 - 有效
  2. $120D - 无效

【问题讨论】:

  • Ruby 的哪个版本? 1.8 具有有限的多字节能力。 1.9+ 有它。
  • 我用的是最新的——1.92

标签: ruby unicode utf-8 character-properties


【解决方案1】:

您可以对字母数字使用 POSIX 表示法:

#!/usr/bin/env ruby -w
# encoding: UTF-8

puts RUBY_VERSION

valid = "ėččę91"
invalid = "$120D"

puts valid[/[[:alnum:]]+/]
puts invalid[/[^[:alnum:]]+/]

哪些输出:

1.9.2
ėččę91
$

【讨论】:

  • [\p{Alphabetic}\p{Number}]一样吗?
【解决方案2】:

在 ruby​​ 正则表达式中,\p{L} 表示任何字母(在任何字形中)

所以如果 s 代表你的字符串:

 s.match /^[\p{L}\p{N}]+$/

这将过滤掉非数字和字母。

【讨论】:

  • 你有 \d\d 不是数字! \pN 是数字,或者说 ruby​​speak,\p{N} 冗长。 \d 只是 \p{Decimal_Number} 又名 \p{Numeric_Type=Decimal} 并不是说​​ Ruby 会费心支持所有这样的 Unicode 属性,但无论如何 1.9 比 1.8 好。不过,还有很长的路要走。
  • 谢谢你,我更新了答案以更精确地使用数字。
  • 从技术上讲,只有 1,000 多个代码点的类型为 \p{Alphabetic},但不是 \p{Letter}。如果您尚未规范化为 NFC 形式,或者已分解为 NFD 或 NFKD,这一点尤其重要,但实际上甚至可以以 NFC 形式出现。只是取决于。
【解决方案3】:

一个字母数字代码点的模式是

/[\p{Alphabetic}\p{Number}]/

从那里很容易推断出这样的事情有一个否定:

/[^\p{Alphabetic}\p{Number}]/

或者这个 for 都是积极的:

 /^[\p{Alphabetic}\p{Number}]+$/

或者有时这个,取决于:

/\A[\p{Alphabetic}\p{Number}]+\z/

选择最适合您的需求。

【讨论】:

    猜你喜欢
    • 2012-08-20
    • 2011-07-11
    • 2018-09-03
    • 2017-11-02
    • 1970-01-01
    • 2021-10-01
    • 2013-03-08
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多