繁体   English   中英

如何在Java中构建正则表达式以检测空格或字符串结尾?

[英]How to build a Regex in java to detect a whitespace or end of a string?

我试图建立一个正则表达式来查找和提取包含邮政信箱的字符串。 这是两个示例:

  1. str =“ some text po box 12456 Floor 105 streetName Street”;
  2. str =“邮政信箱1011”;
  3. str =“ Tallapoosa Street 105号邮政信箱12楼”;
  4. str =“ leclair ryan pc po Box 2499 8th floor 951 East Byrd street”;
  5. str =“ Harvey Road 2 136号1号槽3号大楼”;

这是我的模式和代码:

Pattern p = Pattern.compile("p.*o.*box \\d+(\\z|\\s)"); 
       Matcher m = p.matcher(str); 
       int count =0;
       while(m.find()) {
           count++;
           System.out.println("Match number "+count);
           System.out.println("start(): "+m.start());
           System.out.println("end(): "+m.end());
       }

它与第二个示例配合使用,并为第一个示例提供注释! 如果将我的模式更改为以下内容:

模式p = Pattern.compile(“ p。* o。* box \\ d +”);

它仅适用于第一个示例。 问题是如何将正则表达式分组为字符串“ \\ z”的末尾,将正则表达式分组为空格“ \\ s”或“”?

新模式:模式p = Pattern.compile(“(?i)((p。* o。box \\ s \\ w \\ s * \\ d *(\\ z | \\ s *)|(box \\ s * \\ w \\ s * \\ d *(\\ z | \\ s *))))“);

正则表达式中有几项看起来需要工作。 据我了解,您想从您提供的这种格式的字符串中提取邮政信箱号码。 鉴于此,以下正则表达式将完成您所需的内容,并提供以下说明。 在此处查看其运行情况: https : //regex101.com/r/cQ8lH3/2

Pattern p = Pattern.compile("p\\.?o\\.? box [^ \\r\\n\\t]+");

首先,对于转义序列,您只需使用一个斜杠。 另外,您必须避开这些点。 如果您不逃避这些点,则正则表达式将匹配. 作为任何单个字符。 \\. 而是匹配点符号。

接下来,您需要在\\.后面更改* 量词 \\. 到一个? 为什么? *符号将匹配零个或多个前面的符号,而? 量词仅匹配一个或不匹配。

最后重新考虑一下您如何匹配箱号。 与其匹配所有字符,然后匹配空格,不如匹配所有非空格。 [^ \\r\\n\\t]+将匹配所有非空格字符( ),回车符( \\r ),换行符( \\n )或制表符( \\t )。 因此,它将消耗存储箱编号并在遇到任何空白或文件结尾时立即停止。

为了使您的代码适用于您给出的示例,其中的某些更改可能不是必需的,但它们是构建所需正则表达式的正确方法。

您可以利用以下代码

String str = "some text p.o. box 12456 Floor 105 streetName Street";
Pattern p = Pattern.compile("(?i)\\bp\\.?\\s*o\\.?\\s*box\\s*(\\d+)(?:\\z|\\s)"); 
Matcher m = p.matcher(str); 
int count =0;
while(m.find()) {
      count++;
      System.out.println("Match: "+m.group(0));
      System.out.println("Digits: "+m.group(1));
      System.out.println("Match number "+count);
      System.out.println("start(): "+m.start());
      System.out.println("end(): "+m.end());
}

要使模式不区分大小写,只需将Pattern.CASE_INSENSITIVE标志添加到Pattern.compile声明中,或将内联(?i)修饰符添加到模式之前。

另外, .*匹配除换行符以外的任何其他字符0次或多次,我想您想匹配. 可选。 所以,您只需要? 量词和转义点以匹配文字点。 请注意我是如何使用(...)将数字捕获到组1中的(称为捕获组 )。 与字符串或空格结尾匹配的组位于非捕获组(?:...) )内,该组仅用于分组,而不用于将其值存储在内存缓冲区中。 由于您想在那里匹配单词边界,因此我建议仅用\\\\b代替(?:\\\\z|\\\\s)

Pattern p = Pattern.compile("(?i)\\bp\\.?\\s*o\\.?\\s*box\\s*(\\d+)\\b"); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM