Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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,我使用以下代码在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 = pat

我使用以下代码在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";
输出为“无”,应为(000)000-0000。我哪里做错了。请有人指出。TIA。

根据您的评论:

不,我的目标是:如果输入是(xxx)xxxxxxyyy,那么输出应该是 (xxx)xxx xxxx x=任意整数

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

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


我不想替换它,我想提取它。这是一个巨大的挑战 不同

在这种情况下,好的工具是带有匹配器的模式,正则表达式可以是
\(\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-9]

你的问题无法解决。您需要按如下方式修改它

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
,一个接一个

除此之外,如果您还想知道从输入中排除了什么(如注释中所述,您想提取尾随字符),您可以在regex中使用捕获组,例如

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

你会的

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

其中
valid
(000)000-0000
rest
111

您的代码不编译。一旦修复,它将返回预期值<代码>模式!==图案22。事实上,您有这么多命名糟糕的变量,这可能表明您的实际方法太长,并且使用了几种不同的模式。将其重构为更小的方法。投票以打字错误结束。否我的目标是:如果输入是(xxx)xxx xxxxyyy,那么输出应该是(xxx)xxx xxxx x=任何整数我不想替换它我想提取它。这是一个巨大的差异@你为什么不看看评论呢?只要使用了正确的变量,代码就可以正常工作。
String valid = matcher_22.group(1);
String rest = matcher_22.group(2);