Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式匹配_Java_Regex - Fatal编程技术网

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}
    )(我现在不再提转义)
  • \p{Lu}+
    =一个或多个大写字母(使用正确的Unicode转义-谢谢你,tchrist,在你下面的评论中指出了这一点。用英语来说,等价的字母应该是
    [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:非常非常好的一点,我不敢相信我做了以英语为中心的事情。我已经为其他人打了钩.非常感谢你给我打勾!!而且已经修好了(我之前冲出门,想先仔细检查一下)。