當一個字符串以數字開頭,然後一個點跟隨,然後一個空格和一個或多個大寫字符時,我需要匹配。匹配必須發生在字符串的開頭。我有以下字符串。Java正則表達式匹配
1. PTYU fmmflksfkslfsm
的正則表達式,我試過是:
^\d+[.]\s{1}[A-Z]+
而且它不匹配。對於這個問題,一個有效的正則表達式會是什麼?
當一個字符串以數字開頭,然後一個點跟隨,然後一個空格和一個或多個大寫字符時,我需要匹配。匹配必須發生在字符串的開頭。我有以下字符串。Java正則表達式匹配
1. PTYU fmmflksfkslfsm
的正則表達式,我試過是:
^\d+[.]\s{1}[A-Z]+
而且它不匹配。對於這個問題,一個有效的正則表達式會是什麼?
(對不起,我剛纔的錯誤腦現在堅定地從事呃,大概。)
這工作:
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]+
).*
=別的你只如果你使用的方法類似String#match
(上圖),將嘗試將整個匹配字符串需要.*
底。
很難判斷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
一個真的不應該說'[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
@tchrist:**非常非常好的點**我不能相信我做了一些如此以英語爲中心的事情。我已經勾選了其他人。非常感謝您的請求! – 2010-12-16 19:28:47
"^[0-9]+\. [A-Z]+ .+"
這取決於您使用哪種方法。我認爲它會工作,如果你使用Matcher.find()。如果您使用Matcher.matches(),它將無法工作,因爲匹配在整行上起作用。如果您使用的匹配()解決您的模式如下:
^\d+\.\s{1}[A-Z]+.*
(支付尾隨.*
關注)
而且我也很使用\.
,而不是[.]
。它更具可讀性。
[與我匹配](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
'{1}'是多餘的:它只會混淆表達式並且可以(應該)爲了清晰起見而被刪除。 – 2010-12-16 18:03:45
閱讀關於Java和正則表達式:http://www.regular-expressions.info/java.html。 @AlexR和@codaddict都是對的。你需要在Java中使用'\\'來創建一個'\'。 – 2010-12-16 18:07:33