代码之家  ›  专栏  ›  技术社区  ›  SapphireSun

在正则表达式中,只匹配字母的最佳方法是什么?

  •  13
  • SapphireSun  · 技术社区  · 14 年前

    我真的很想使用\w,但它也匹配下划线,所以我要使用[a-za-z],这让我感觉不必要的冗长和以美国为中心。有更好的方法吗?像[\w^](我怀疑我的语法是对的)?

    7 回复  |  直到 11 年前
        1
  •  7
  •   Matt K    14 年前

    你可以用 /[a-z]/i /[[:alpha:]]/ 也一样。事实上, \w 包括数字,这样就不起作用了。

        2
  •  15
  •   zigdon    14 年前

    也许你是说 /[[:alpha:]]/ ?见 perlre 用于讨论POSIX字符类。

        3
  •  11
  •   Tim Pietzcker    14 年前

    只是使用 \p{L} 这意味着“任何Unicode字母”,并在Perl中工作( /\p{L}/ )你可能需要 use utf8; .

        4
  •  8
  •   Community Jaime Torres    7 年前

    匹配国际字符(即非ASCII字符)有点困难,可能需要很多东西。查看此示例:

    #!perl -w
    
    use strict;
    use utf8;
    
    my $string = "ä";
    
    print "matched :alpha:\n"  if $string =~ /[[:alpha:]]/;
    print "matched ^\\W0-9_\n" if $string =~ /[^\W0-9_]/;
    print "matched [a-zA-Z]\n" if $string =~ /[a-zA-Z]/;
    print "matched [a-z]i\n"   if $string =~ /[a-z]/i;
    print "matched [A-z]\n"    if $string =~ /[A-z]/;
    

    对我来说,这会导致

    matched :alpha:
    

    如果你移除 use utf8 然后没有一个正则表达式匹配。

    看着 this very relevant question ,看起来你可能想 使用UTF8 然后退房 Unicode::Semantics .

    当然,如果您使用的是直接的ASCII字符,那么前面提到的任何正则表达式都可以工作。

        5
  •  6
  •   runrig    14 年前
    [^\W0-9_]
    
    # or
    
    [[:alpha:]]
    

    见Perldoc perlre

        6
  •  4
  •   vol7ron    14 年前

    几个选项:

    1. /[a-z]/i               # case insensitive
    2. /[A-Z]/i               # case insensitive
    3. /[A-z]/                # explicit range listing (capital 'A' to lowercase 'z')
    4. /[[:alpha:]]/          # POSIX alpha character class
    

    我建议使用不区分大小写或正确的方式 /[a-zA-z]/ 除非你有某种语言偏好。

    注:

    • 数字3需要大写字母“A”,然后小写字母“Z”,这是因为ASCII值的顺序;如果执行相反的操作,则不起作用: a-Z . 也: 此方法将使无下划线条件失败,因为它包括 [\]^` .
    • 数字4将与这些附加语言字符匹配,但也将与以下字符匹配:
      ʹʺʻˍˎˏːˑˬˮ̀́ (加上许多其他的)
        7
  •  1
  •   Community Jaime Torres    7 年前

    你在寻找国际化的正则表达式?然后你需要像这个人那样做: JavaScript validation issue with international characters

    明确匹配所有月球语言字母:)