2010-12-16 67 views
11

當一個字符串以數字開頭,然後一個點跟隨,然後一個空格和一個或多個大寫字符時,我需要匹配。匹配必須發生在字符串的開頭。我有以下字符串。Java正則表達式匹配

1. PTYU fmmflksfkslfsm 

的正則表達式,我試過是:

^\d+[.]\s{1}[A-Z]+ 

而且它不匹配。對於這個問題,一個有效的正則表達式會是什麼?

+0

[與我匹配](http://regexpal.com/?flags=®ex=^\d%2B [。] \ s {1} [AZ]%2B&input = 1.%20PTYU%20fmmflksfkslfsm)被重寫爲'^ \ d + \。\ s [A-Z] +' – 2010-12-16 18:00:49

+2

'{1}'是多餘的:它只會混淆表達式並且可以(應該)爲了清晰起見而被刪除。 – 2010-12-16 18:03:45

+1

閱讀關於Java和正則表達式:http://www.regular-expressions.info/java.html。 @AlexR和@codaddict都是對的。你需要在Java中使用'\\'來創建一個'\'。 – 2010-12-16 18:07:33

回答

26

(對不起,我剛纔的錯誤腦現在堅定地從事呃,大概。)

這工作:

String rex = "^\\d+\\.\\s\\p{Lu}+.*"; 

System.out.println("1. PTYU fmmflksfkslfsm".matches(rex)); 
// true 

System.out.println(". PTYU fmmflksfkslfsm".matches(rex)); 
// false, missing leading digit 

System.out.println("1.PTYU fmmflksfkslfsm".matches(rex)); 
// false, missing space after . 

System.out.println("1. xPTYU fmmflksfkslfsm".matches(rex)); 
// false, lower case letter before the upper case letters 

其分解:

  • ^ =啓動字符串
  • \d+ =一個或多個數字(該\被轉義,因爲它是在一個字符串,因此\\
  • \. = A文字.(或原件[.]是罰款)(再次逃過字符串中)
  • \s =一個空格字符(不需要它後{1}(我會停下來,現在提的逃逸)
  • \p{Lu}+ =一個或多個大寫字母(使用適當的Unicode逃逸  — 謝謝你,tchrist,在下面的評論中指出這一點。在英語方面,相當於將[A-Z]+
  • .* =別的

詳見the documentation here

你只如果你使用的方法類似String#match(上圖),將嘗試將整個匹配字符串需要.*底。

+1

很難判斷OP是否使用7位ASCII數據,或者是否需要它處理任何Java字符 - 它們是Unicode,而不是ASCII。如果是後者,你當然需要做出調整。 '\ p {Lu}'對於大寫字母來說可能是足夠好的,但是Java沒有提供討論Unicode空白的方便方法,所以你必須編寫''\ u000A- \ u00D \ u0085 \ u00A0 \ u1680 \ u180E \ u2000- \ u200A \ u2028 \ uF2F \ uF3F \ u3000]',因爲[我在別處寫過](http://stackoverflow.com/questions/4304928/unicode-equivalents-for-w-and-b-in -java正則表達式/ 4307261#4307261)。 – tchrist 2010-12-16 18:15:10

+1

一個真的不應該說'[A-Z] +'匹配「一個或多個大寫字母」,因爲這就是'\ p {Lu} +'所做的。 '[A-Z] +'僅僅匹配A到Z中的一個或多個(並且更喜歡更多) - 我認爲它們略微但顯着不同。同樣,'\ s'不是一個空白字符,而只是'[\ t \ n \ x0B \ f \ r]'中的一個。我在這裏太挑剔嗎?我使用巨大的Unicode字符的語料庫工作 - 但從不* ASCII *每天使用Java和Perl,所以或許我需要比別人更小心。或者可能不是? – tchrist 2010-12-16 18:22:31

+1

@tchrist:**非常非常好的點**我不能相信我做了一些如此以英語爲中心的事情。我已經勾選了其他人。非常感謝您的請求! – 2010-12-16 19:28:47

1

這取決於您使用哪種方法。我認爲它會工作,如果你使用Matcher.find()。如果您使用Matcher.matches(),它將無法工作,因爲匹配在整行上起作用。如果您使用的匹配()解決您的模式如下:

^\d+\.\s{1}[A-Z]+.* 

(支付尾隨.*關注)

而且我也很使用\.,而不是[.]。它更具可讀性。