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

时间:2010-09-20 18:00:18

标签: regex perl letters

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

7 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:11)

只需使用\p{L}表示“任何Unicode字母”,并在Perl(/\p{L}/)中运行。您可能需要use utf8;

答案 2 :(得分:8)

您也可以使用/[a-z]/i/[[:alpha:]]/。实际上,\w包含数字,因此甚至无法使用。

答案 3 :(得分:8)

匹配国际(即非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字符,那么上述任何正则表达式都可以使用。

答案 4 :(得分:6)

[^\W0-9_]

# or

[[:alpha:]]

请参阅perldoc perlre

答案 5 :(得分:4)

一些选择:

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将匹配这些其他语言字符,但它也匹配:
    ʹʺʻˍˎˏːˑˬˮ̀́(加上许多其他人)

答案 6 :(得分:1)

您正在寻找正则表达式的国际化吗?然后你需要做这样的事情:JavaScript validation issue with international characters

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