当字符串以数字开头,然后是一个点,然后是一个空格和一个或多个大写字符时,我需要匹配。匹配必须出现在字符串的开头。我有以下字符串。
1. PTYU fmmflksfkslfsm
我试过的正则表达式是:
^\d+[.]\s{1}[A-Z]+
它不匹配。对于这个问题,正则表达式是什么?
答案 0 :(得分:27)
(对不起我之前的错误。大脑现在已经坚定了。呃,可能。)
这有效:
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+
=一个或多个数字(\
已转义,因为它位于字符串中,因此\\
) \.
=文字.
(或您原来的[.]
没问题)(再次,在字符串中转义) \s
=一个空白字符(后面不需要{1}
)(我现在不再提及转义) \p{Lu}+
=一个或多个大写字母(使用正确的Unicode转义 - 谢谢你,tchrist,在下面的评论中指出这一点。在英语术语中,相当于是[A-Z]+
).*
=其他任何内容有关详细信息,请参阅the documentation here。
如果您使用.*
(上图)之类的方法尝试匹配整个字符串,则最后只需要String#match
。
答案 1 :(得分:1)
这取决于您使用的是哪种方法。我认为如果你使用Matcher.find()会有效。如果您使用Matcher.matches(),它将无法工作,因为匹配在整行上工作。如果您使用匹配()修复您的模式如下:
^\d+\.\s{1}[A-Z]+.*
(注意尾随.*
)
我还会使用\.
代替[.]
。它更具可读性。
答案 2 :(得分:0)
"^[0-9]+\. [A-Z]+ .+"