Ruby:如何检查UTF-8字符串是否只包含字母和数字?

Ruby:如何检查UTF-8字符串是否只包含字母和数字?,ruby,unicode,utf-8,character-properties,Ruby,Unicode,Utf 8,Character Properties,我有一个UTF-8字符串,可以是任何语言 如果不包含任何非字母数字字符,如何检查 我在UnicodeUtils Ruby gem中找不到这种方法 示例: ėę91-有效 $120D-无效 您可以使用POSIX符号表示字母数字: #!/usr/bin/env ruby -w # encoding: UTF-8 puts RUBY_VERSION valid = "ėččę91" invalid = "$120D" puts valid[/[[:alnum:]]+/] puts invalid

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

如果不包含任何非字母数字字符,如何检查

我在UnicodeUtils Ruby gem中找不到这种方法

示例:

  • ėę91-有效
  • $120D-无效

  • 您可以使用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
    $
    

    您可以使用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
    $
    

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

    因此,如果s代表字符串:

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

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

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

    因此,如果s代表字符串:

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

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

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

    /[\p{Alphabetic}\p{Number}]/
    
    从这里很容易推断出这样的情况,因为它有一个负值:

    /[^\p{Alphabetic}\p{Number}]/
    
    或者,这一切都是积极的:

     /^[\p{Alphabetic}\p{Number}]+$/
    
    有时,这取决于:

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

    选择一个最适合您的需要。

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

    /[\p{Alphabetic}\p{Number}]/
    
    从这里很容易推断出这样的情况,因为它有一个负值:

    /[^\p{Alphabetic}\p{Number}]/
    
    或者,这一切都是积极的:

     /^[\p{Alphabetic}\p{Number}]+$/
    
    有时,这取决于:

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

    选择最适合您需要的版本。

    哪个版本的Ruby?1.8具有有限的多字节能力。我使用的是最新的版本-1.92哪个版本的Ruby?1.8具有有限的多字节能力。1.9+有黑桃。我正在使用最新的一个-1.92你有
    \d
    ,但
    \d
    不是数字
    \pN
    是数字,或rubyspeak,即
    \p{N}
    的详细程度
    \d
    只是
    \p{Decimal\u Number}
    a.k.a.
    \p{Numeric\u Type=Decimal}
    不是Ruby费心支持所有类似的Unicode属性,但无论如何1.9比1.8好。不过,还有很长的路要走。为此,我更新了答案,使数字更加精确。从技术上讲,只有1000多个代码点是
    \p{alphastic}
    类型,但不是
    \p{Letter}
    。如果您还没有规范化为NFC形式,或者已经反配置为NFD或NFKD,这一点尤其重要,但事实上,甚至在NFC形式中也可能发生。看情况而定。你有
    \d
    ,但
    \d
    不是数字
    \pN
    是数字,或rubyspeak,即
    \p{N}
    的详细程度
    \d
    只是
    \p{Decimal\u Number}
    a.k.a.
    \p{Numeric\u Type=Decimal}
    不是Ruby费心支持所有类似的Unicode属性,但无论如何1.9比1.8好。不过,还有很长的路要走。为此,我更新了答案,使数字更加精确。从技术上讲,只有1000多个代码点是
    \p{alphastic}
    类型,但不是
    \p{Letter}
    。如果您还没有规范化为NFC形式,或者已经反配置为NFD或NFKD,这一点尤其重要,但事实上,甚至在NFC形式中也可能发生。这要看情况了。这和
    [\p{Alphabic}\p{Number}]
    一样吗?这和
    [\p{Alphabic}\p{Number}]
    一样吗?