![](/img/trans.png)
[英]Java Regex pattern to match String from all languages that end with a whitespace
[英]How to build a Regex in java to detect a whitespace or end of a string?
我试图建立一个正则表达式来查找和提取包含邮政信箱的字符串。 这是两个示例:
这是我的模式和代码:
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.