2010-09-01 247 views
244

如何編寫僅匹配字母的正則表達式?正則表達式僅匹配字母

+45

你對字符的定義是什麼? ASCII?漢子? ISO-XXXX-X? UTF8? – 2010-09-01 12:10:11

+33

您對「正則表達式」的定義是什麼? Perl的? Emacs的? grep的? – 2010-09-01 12:17:24

回答

264

使用字符集:[a-zA-Z]與小寫和大寫的A-Z中的一個字母匹配。 [a-zA-Z]+匹配一個或多個字母,並且^[a-zA-Z]+$僅匹配只包含一個或多個字母的字符串(^$分別標記字符串的開頭和結尾)。

如果要匹配除A-Z之外的其他字母,可以將它們添加到字符集:[a-zA-ZäöüßÄÖÜ]。或者您使用預定義的字符類,如Unicode character property\p{L},它描述了字母的Unicode字符。

+69

這是一個非常以ASCII爲中心的解決方案。這幾乎會打破任何非英文文本。 – 2010-09-01 12:13:14

+6

@Joachim Sauer:它寧可打破使用非拉丁字符的語言。 – Gumbo 2010-09-01 12:17:59

+8

德語文本的90%已經打破了,甚至不提法文或西班牙文。儘管意大利人仍然可以做得很好。 – 2010-09-01 12:22:32

127

\p{L}匹配任何是一個Unicode字母,如果你有興趣字母超越拉丁一個

+0

並非所有正則表達式。例如,vim正則表達式將'\ p'視爲「可打印字符」。 – 2010-09-01 12:12:28

+3

那麼在支持unicode的,然後正則表達式 – RobV 2010-09-01 12:13:19

+1

[此頁]任何正則表達式引擎(http://www.regular-expressions.info/refflavors.html)認爲只有Java中,.NET,PERL,jgsoft,XML和XPath的正則表達式的支持\ p {L}。但重大遺漏:python和ruby(儘管python有正則表達式模塊)。 – 2010-09-01 12:16:33

32

根據你的 「個性」 的含義:

[A-Za-z] - 所有字母(大寫和小寫)

[^0-9] - 所有非數字字符

+0

我的意思是說。它似乎沒有工作。 preg_match('/ [a-zA-Z] + /',$ name); – Nike 2010-09-01 12:19:01

+0

[A-Za-z]只是您可以使用的字符聲明。您仍然需要聲明如何使用此聲明:[A-Za-z] {1,2}(匹配1或2個字母)或[A-Za-z] {1,*}(以匹配1個或多個字母) – Molske 2010-09-01 13:06:41

+6

井A,A,A,O,A ......是信了,所以是অ,আ,ই,ঈ,Є,Ж,З,ح,خ,دא,ב,ג,ש ,ת,... https://en.wikipedia.org/wiki/Letter_%28alphabet%29 – 2016-09-20 09:50:37

10

對於PHP,下面如果你的意思是何字符編碼的任何信件將正常工作

'/^[a-zA-Z]+$/' 
2

,然後一個很好的辦法可能是刪除非字母狀空間\s,數字\d,以及其他特殊字符,如:

[[email protected]#\$%\^&\*\(\)\[\]:;'",\. ...more special chars... ] 

或使用以上否定之否定直接描述的信:

\S \D and [^ ..special chars..] 

優點:

  • 適用於所有的正則表達式的口味。
  • 易寫,有時節省很多時間。

缺點:

  • 長,有時並不完美,但字符編碼也可被打破。
3

只需使用\w[:alpha:]。這是一個轉義序列,它只匹配可能出現在文字中的符號。

+5

在所有情況下,'\ w'可能不是一個好的解決方案。至少在PCRE中,'\ w'也可以匹配其他字符。引用[PHP手冊](http://uk3.php.net/manual/en/regexp.reference.escape.php):「*」單詞「字符是任何字母或數字或下劃線字符,也就是說,任何可以成爲Perl「單詞」一部分的字符字母和數字的定義由PCRE的字符表來控制,如果發生特定於語言環境的匹配,字母和數字的定義可能會有所不同,例如,在「fr」(法語)區域設置,一些大於128的字符代碼用於重音字母,並且這些符號由\ w。*「匹配。 – 2014-06-08 19:56:26

+0

詞包括字母 – 2015-05-15 03:05:55

+2

其他字符'\ w'意味着匹配的字母和數字 – 2016-08-26 16:10:33

0

圖案=/[A-ZA-Z]/

看跌期權 「[1 - ZA-Z]:#{pattern.match(」 礦開花 「)}」 OK

看跌期權「[一個-ZA-Z]:#{pattern.match( 「456」)} 「

看跌期權 」[1 - ZA-Z]:#{pattern.match(「 」)}「

看跌期權」 [a-zA-Z]:#{pattern.match(「#$%^ & *」)}「

puts」[a-zA-Z]:#{pattern.match(「#$%^ & * A「)}」OK

2

您可以試試以下正則表達式:[^\W\d_][a-zA-Z]

+0

這不是什麼'[^ \ W | \ d]'意味着 – OGHaza 2014-07-25 13:34:24

+0

'[^ \ W | \ d]'表示不'\ W'而不是'|'而不是'\ d'。它具有相同的淨效果,因爲'|是'\ W'的一部分,但是'|'不像你認爲的那樣工作。即便如此,這意味着它接受'_'字符。您可能正在尋找'[^ \ W \ d_]' – OGHaza 2014-07-25 14:47:32

+0

我同意你的意見,它接受'_'。但是, 「NOT」'|'大於等於 「AND」,所以'[^ \ W | \ d]'表示:NOT'\ W' **和**不是'\ D' – Motlab 2014-07-25 15:01:18

24

最近的可用選項是

[\u\l]+ 

其中的大寫和小寫字母的順序一致。但是,並非所有的編輯器/語言的支持,所以它可能是更安全的使用

[a-zA-Z]+ 

其他用戶建議

+0

雖然不匹配任何特殊字符。 – Nyerguds 2016-05-25 06:25:14

5

你會使用

/[a-z]/gi 

[] - 檢查給定輸入之間的任何字符

az ---涵蓋整個字母表

g --- --globally在整個字符串

我-----越來越大寫和小寫

-2
Pattern pattern = Pattern.compile("^[a-zA-Z]+$"); 

if (pattern.matcher("a").find()) { 

    ...do something ...... 
} 
7

這幾個人寫的正則表達式 「/^[A-ZA-Z] $ /我」是不正確的,因爲在最後,他們都提到/我這是不區分大小寫並首次將返回匹配之後。代替/我只是使用/克這是全球性的,你也沒有任何需要把^$爲開始和結束。 [_ A-Z] +匹配單個字符存在於低於

  • 量詞列表

    /[a-zA-Z]+/g 
    
    1. +之間一個和無限次,多次地,用之於根據需要
    2. AZ的範圍內的單個字符a和z(區分大小寫)
    3. AZ之間的單個字符在A和Z(區分大小寫)
    4. 改性劑之間的範圍內:全球。所有的比賽(不上的第一場比賽返回)
  • -1
    String string= "abcdef"; 
    
    if(string.match("^[a-zA-Z]+$$")){ 
        System.out.println("string only contains letters"); 
    } 
    
    5

    使用字符組

    \D 
    

    匹配除數字0-9

    ^\D+$ 
    

    見例如here

    任何字符
    +0

    這也將匹配空白,符號等,這似乎不是問題的要求。 – DaveMongoose 2018-01-02 09:31:30

    相關問題