使用正则表达式提取Java中的子字符串。如何包含空格字符

时间:2018-06-30 09:38:44

标签: java regex

我正在使用以下代码在JAVA中提取字符串: 输入为(000)000-0000111 ,输出应为(000)000-0000

String text = "(000) 000-0000111";

 String pattern2 = "[(][0-9][0-9][0-9][)]\\s[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]";
 Pattern pattern_22 = Pattern.compile(pattern2);
Matcher matcher_22 = pattern.matcher(text);

if(matcher_22.find()) {

    return matcher_22.group(0);
}
else
    return "NONE";

输出将显示为“ NONE”,它应该是(000)000-0000。我要去哪里错了。可以请别人指出。 TIA。

3 个答案:

答案 0 :(得分:1)

根据您的评论:

  

我的目标不是:如果输入为(xxx)xxx-xxxxyyy,则输出应为   (xxx)xxx-xxxx x =任何整数

如果要替换最后三位数字,可以使用:

phone = phone.replaceAll("\\d{3}$", "");

regex demo


  

我不想替换它,我想提取它。有一个巨大的   差异!

在这种情况下,好的工具是Pattern with Matcher,您的正则表达式可以是\(\d{3}\)\s\d{3}-\d{4}

String text = "(000) 000-0000111";

String regex = "\\(\\d{3}\\)\\s\\d{3}-\\d{4}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
    return matcher.group();
} else {
    return "NONE";
}

答案 1 :(得分:0)

只需用以下内容替换您的模式字符串:

[^1-9]

答案 2 :(得分:0)

您的问题无法编译。您需要进行如下修改

String text = "(000) 000-0000111";

String pattern2 = "[(][0-9][0-9][0-9][)]\\s[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]";
Pattern pattern_22 = Pattern.compile(pattern2);
Matcher matcher_22 = pattern_22.matcher(text);

if (matcher_22.find()) {
    return matcher_22.group(0);
} else {
    return "NONE";
}

这将根据您的问题输出(000)000-0000

尽管如此,您当前的正则表达式非常冗长。您可以使用更简单的方法,例如

\(\d{3}\) \d{3}\-\d{4}

请注意,在Java中,您必须转义反斜杠,因此在Java代码的上下文中它将是

\\(\\d{3}\\) \\d{3}\\-\\d{4}

其中\d代表一个数字(0-9),{n}代表一组n,一个接一个。

如果除此之外,您还想知道输入中排除的内容(如注释中所述,您想提取尾随字符),则可以在正则表达式中使用捕获组,例如

(\(\d{3}\) \d{3}\-\d{4})(.*)

第一个捕获组(\(\d{3}\) \d{3}\-\d{4})将为您提供所需的输出模式,第二个捕获组(.*)将为您提供所有随后的输出。如果在Java中使用,则还必须转义反斜杠。

使用

pattern2 = "(\\(\\d{3}\\) \\d{3}\\-\\d{4})(.*)";

你会

String valid = matcher_22.group(1);
String rest = matcher_22.group(2);

其中valid(000) 000-0000,而rest111