2010-12-16 71 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]+.* 

(支付尾随.*关注)

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