2010-09-20 69 views
12

我真的想使用\ w但它也匹配下划线,所以我要与[A-Za-z]一起感觉不必要的冗长和美国为中心。有一个更好的方法吗?像[\ w^_]之类的东西(我怀疑我的语法正确)?在正则表达式中只匹配字母的最佳方式是什么?

+4

'[A-Za-z]'不是以美国为中心的,它是以ASCII为中心的。 – CanSpice 2010-09-20 19:09:55

+0

@CanSpice,我会说它是以拉丁为中心的,因为ASCII只使用拉丁字母。 – Axeman 2010-09-20 19:53:55

+1

@Axeman,来源? AFAIK许多拉丁派生语言强调元音和字母。 [A-Za-z]不会与西班牙语和法语不匹配。即使是纯粹的拉丁文也有不在ASCII内部的Æ字形。你在说什么拉丁语? – Kyordhel 2017-11-27 19:28:55

回答

7

你可以使用/[a-z]/i/[[:alpha:]]/一样好。实际上,\w包含数字,因此甚至不起作用。

+1

我认为'i'使它不区分大小写? – keithjgrant 2010-09-20 18:26:45

+0

这是正确的。 – mkb 2010-09-20 18:47:16

+1

这只是不正确的答案。参见下文。 – 2016-04-26 04:10:52

15

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

+1

我仍然认为这不考虑国际字符,因为':alpha:'仍然是'a-zA-Z' – vol7ron 2010-09-20 18:32:55

+0

我错了; perldocs应该更新。但它确实包括了额外的标点:'''''' – vol7ron 2010-09-20 23:48:23

+0

@ vol7tron:您的评论正在泄漏... – 2010-09-20 23:57:04

1

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

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

+0

我在该正则表达式中看不到任何月亮字母,但这可能只是因为我正在日光下阅读它。 – mkb 2010-09-20 18:46:52

+0

当你看到它们时,你应该嚎叫 – vol7ron 2010-09-20 23:33:31

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]/,除非你有一定的语言偏好。

注:

  • 3号需要资本 'A',因为ASCII值的顺序先小写的 'Z';如果你做了相反的处理,它不起作用:a-Z。另外:此方法会失败无下划线标准,因为它包括[\]^_`
  • 4号将匹配这些额外的语言字符,但它也对比赛:
    ʹʺʻˍˎˏːˑˬˮ̀́  (以及许多其他)
+0

'[A-z]'范围包括一堆其他字符。 – NullUserException 2010-09-20 19:02:54

+0

你是对的,有几个括号和额外的字符,这将打破没有下划线的标准。我修改了答案。 @flies,是的,但我错了。真的,前两个是相同的方法,只是表明你可以使用不同的输入。 – vol7ron 2010-09-20 23:22:02

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和检查出​​。

当然,如果你使用的是直接的ASCII字符,比任何前述的正则表达式都可以工作。

+0

你必须在Perl中注意\ w和\ W。最近有点动人的目标,所以我不会依赖它的定义。 – 2010-09-20 21:19:08

+0

编辑器显示为'ä'的内容可能不是Perl中的字母。 'ä'=“\ xE4”未在ASCII字符集中定义,默认情况下,Perl将使用ASCII字符类作为未编码为UTF8的字符串。添加'use utf8;'会将你的源代码视为UTF8,并使“ä”成为一个Unicode字符串。在Unicode字符集中,'ä'是一个字母字符。比较'$ string =“ä”;'vs'$ string = decode(“iso-8859-1”,“ä”);'不使用utf8;'。在第一种情况下,Perl会看到二进制数据,第二种情况下二进制数据被解释为Latin-1并转换为UTF-8。 – 2010-09-21 20:29:44

11

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

相关问题