【问题标题】:What is the best way to match only letters in a regex?在正则表达式中只匹配字母的最佳方法是什么?
【发布时间】:2011-04-14 19:45:03
【问题描述】:

我真的很想使用 \w,但它也匹配下划线,所以我会使用 [A-Za-z],它感觉不必要的冗长和以美国为中心。有一个更好的方法吗? [\w^_] 之类的东西(我怀疑我的语法是否正确)?

【问题讨论】:

  • [A-Za-z] 不是以美国为中心,而是以 ASCII 为中心。
  • @CanSpice,我想说它以拉丁语为中心,因为 ASCII 仅使用拉丁字母。
  • @Axeman,来源? AFAIK 许多源自拉丁语的语言都强调元音和字母。 [A-Za-z] 既不匹配 Español 也不匹配 Française。即使是纯拉丁文也有不在 ASCII 中的 Æ 字形。你说的是哪个拉丁语?
  • @Gzork, Classical 23 个字符的拉丁字母 + 中世纪的 J、U 和 W

标签: regex perl letters


【解决方案1】:

也许你的意思是/[[:alpha:]]/?有关 POSIX 字符类的讨论,请参阅 perlre

【讨论】:

  • 我仍然认为这不会考虑国际字符,因为:alpha: 仍然是a-zA-Z
  • 我错了; perldocs 应该更新。但是它确实包含额外的标点符号:ʹʺʻˍˎˏːˑˬˮ̀́
  • @vol7ron:额外的标点符号超出了评论范围,溢出到您的用户名中。 (Windows XP 上的 Firefox 3.6.10)
  • @Jon Purdy:啊,我怀疑这是在输出中包含 unicode 字符的副作用 - 另一个不使用的原因:alpha:
【解决方案2】:

只需使用\p{L},它的意思是“任何Unicode 字母”并且可以在Perl (/\p{L}/) 中使用。你可能需要use utf8;

【讨论】:

    【解决方案3】:

    您也可以使用/[a-z]/i/[[:alpha:]]/。事实上,\w 包含数字,所以这甚至不起作用。

    【讨论】:

    • 我认为i 使其不区分大小写?
    【解决方案4】:

    匹配国际(即非 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,您可能想要use utf8 并查看Unicode::Semantics

    当然,如果您使用的是纯 ASCII 字符,则上述任何正则表达式都可以使用。

    【讨论】:

    • 你必须小心 Perl 中的 \w 和 \W。它最近有点移动目标,所以我不会依赖它的定义。
    • 您的编辑器显示为 'ä' 的内容可能不是 Perl 中的字母。 'ä' = "\xE4" 未在 ASCII 字符集中定义,默认情况下 Perl 将对未编码为 UTF8 的字符串使用 ASCII 字符类。添加use utf8; 会将您的源代码视为UTF8 并使“ä”成为Unicode 字符串。在 Unicode 字符集中,'ä' 是一个字母字符。比较 $string = "ä"; 与没有 use utf8;$string = decode("iso-8859-1", "ä");。在第一种情况下,Perl 将看到二进制数据,在第二种情况下,二进制数据被解释为 Latin-1 并转换为 UTF-8。
    【解决方案5】:
    [^\W0-9_]
    
    # or
    
    [[:alpha:]]
    

    见 perldoc perlre

    【讨论】:

      【解决方案6】:

      几个选项:

      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]/,除非您有某种语言偏好。

      注意:

      • 由于 ASCII 值的顺序,数字 3 首先需要大写“A”,然后是小写“z”;如果你做相反的事情,它就不起作用:a-Z。另外:此方法将不符合无下划线标准,因为它包括 [ \ ] ^ _ `
      • 数字 4 将匹配这些额外的语言字符,但它也匹配:
        ʹʺʻˍˎˏːˑˬˮ̀́ (以及许多其他字符)

      【讨论】:

      • [A-z] 范围包括一堆其他字符。
      • 你是对的,有几个括号和额外的字符,这会破坏无下划线标准。我已经修改了答案。 @flies,是的,但我不正确。前两个确实是相同的方法,只是表明您可以使用不同的输入。
      【解决方案7】:

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

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

      【讨论】:

      • 我在那个正则表达式中看不到任何月亮字母,但这可能只是因为我在白天阅读它。
      • 当你看到它们时,你应该嚎啕大哭
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      相关资源
      最近更新 更多