Java正则表达式匹配
当一个字符串以数字开头,然后是一个点,然后是一个空格和一个或多个大写字符时,我需要进行匹配。匹配必须出现在字符串的开头。我有下面的字符串Java正则表达式匹配,java,regex,Java,Regex,当一个字符串以数字开头,然后是一个点,然后是一个空格和一个或多个大写字符时,我需要进行匹配。匹配必须出现在字符串的开头。我有下面的字符串 1. PTYU fmmflksfkslfsm 我尝试使用的正则表达式是: ^\d+[.]\s{1}[A-Z]+ 而且它不匹配。对于这个问题,工作正则表达式是什么?“^[0-9]+\.[a-Z]+.+”它取决于您使用的方法。我认为如果使用Matcher.find(),它会起作用。如果您使用的是Matcher.matches(),它将不起作用,因为match可
1. PTYU fmmflksfkslfsm
我尝试使用的正则表达式是:
^\d+[.]\s{1}[A-Z]+
而且它不匹配。对于这个问题,工作正则表达式是什么?
“^[0-9]+\.[a-Z]+.+”
它取决于您使用的方法。我认为如果使用Matcher.find(),它会起作用。如果您使用的是Matcher.matches(),它将不起作用,因为match可以在整行上工作。如果您使用的是matches(),请按以下方式修复您的模式:
^\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+
在字符串中,所以将其转义,因此\
)\
=文本\.
(或者您的原始
很好)(再次在字符串中转义)[.]
=一个空格字符(后面不需要\s
)(我现在不再提转义){1}
=一个或多个大写字母(使用正确的Unicode转义-谢谢你,tchrist,在你下面的评论中指出了这一点。用英语来说,等价的字母应该是\p{Lu}+
)[A-Z]+
=还有什么吗*
如果您使用像
String#match
(上面)这样的方法试图匹配整个字符串,那么您只需要在结尾处使用*
。但可以重写为^\d+\。[a-Z]+
{1}
是多余的:它只会使表达式变得混乱,并且可以(应该)为了清晰起见,请删除。请阅读有关Java和正则表达式的内容:@AlexR和@codaddict都是对的。您需要在Java中使用\
来创建一个\
。很难判断OP是否使用了7位ASCII数据,或者他是否需要它来处理任何Java字符,这些字符是Unicode,而不是ASCII。如果是后者,你当然需要做出调整\p{Lu}
对于大写字母来说可能已经足够好了,但是Java并没有提供谈论Unicode空白的便捷方式,所以您必须编写[\u000A-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]
,就像这样。人们真的不应该说[A-Z]+
匹配“一个或多个大写字母”,因为这是\p{Lu}+
所做的。[A-Z]+
只匹配A到Z中的一个或多个字母(并且更喜欢多个字母),我认为这两个字母略有不同,但有显著差异。类似地,\s
不是空白字符,而是[\t\n\x0B\f\r]
仅此而已。我是不是太挑剔了?我每天都在使用Java和Perl处理大量GB的Unicode字符库——但从来没有ASCII字符库,所以也许我需要比其他人更加小心。或者也许不是这样?@tchrist:非常非常好的一点,我不敢相信我做了以英语为中心的事情。我已经为其他人打了钩.非常感谢你给我打勾!!而且已经修好了(我之前冲出门,想先仔细检查一下)。