16

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

4

7 回答 7

16

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

于 2010-09-20T18:03:27.753 回答
13

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

于 2010-09-20T19:07:21.503 回答
8

您可以使用/[a-z]/i/[[:alpha:]]/也可以。事实上,\w包括数字,这样甚至都行不通。

于 2010-09-20T18:04:24.303 回答
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则没有任何正则表达式匹配。

查看这个非常相关的问题,您可能想要use utf8查看Unicode::Semantics

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

于 2010-09-20T18:50:03.010 回答
6
[^\W0-9_]

# or

[[:alpha:]]

见 perldoc perlre

于 2010-09-20T18:04:05.680 回答
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

我建议使用不区分大小写或 true way /[a-zA-z]/,除非您有某种语言偏好。

笔记:

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

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

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

于 2010-09-20T18:06:56.297 回答