Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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

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,我正在尝试为类似的东西编写正则表达式 s1 = I am at Boston at Dowtown s2 = I am at Miami > .*? (at \w+)+.* 我对以下单词感兴趣:波士顿、市中心、迈阿密 我还没有成功地为此创建正则表达式。类似 s1 = I am at Boston at Dowtown s2 = I am at Miami > .*? (at \w+)+.* 仅给出s1中的波士顿(错过市中心)。它只匹配任何建议的第一个“at”试试这个 at\

我正在尝试为类似的东西编写正则表达式

s1 = I am at Boston at Dowtown
s2 = I am at Miami
> .*? (at \w+)+.*
我对以下单词感兴趣:波士顿、市中心、迈阿密

我还没有成功地为此创建正则表达式。类似

s1 = I am at Boston at Dowtown
s2 = I am at Miami
> .*? (at \w+)+.*
仅给出s1中的波士顿(错过市中心)。它只匹配任何建议的第一个“at”

试试这个

 at\s+(\w+)
完整的代码片段是

Pattern myPattern = Pattern.compile("at\\s+(\\w+)", Pattern.DOTALL, Pattern.CASE_INSENSITIVE);
Matcher m = myPattern.matcher(yourString);

while(m.find()) {
  String word = m.group(1);
}
您似乎希望
(at\w++)
在第一个字符串中与波士顿的
和市中心的
匹配。这不起作用,因为在
处不允许在第二个
之前留出空间。您需要将其更改为
(at\w+++
——或者更好,将其更改为非捕获组,并将捕获组用于您真正感兴趣的部分:

Pattern p = Pattern.compile(".*?(?: at (\\w+))+.*");
String s1 = "I am at Boston at Downtown";
Matcher m = p.matcher(s1);
if (m.matches()) {
    System.out.println(m.group(1));
}
但现在它只打印市中心的
。这是因为您试图使用一个捕获组来捕获两个子字符串。第一次
(?:在(\\w+)+
匹配时,它捕获
波士顿
;第二次,它丢弃了波士顿,取而代之的是市中心

有一些正则表达式风格可以让您检索中间捕获(在本例中为
Boston
),但Java不是其中之一。您最好的选择可能是使用
find()
而不是@arclight建议的
matches()
。这也使正则表达式变得更简单:

Pattern p = Pattern.compile("\\bat\\s+(\\w+)");
String s1 = "I am at Boston at Downtown";
Matcher m = p.matcher(s1);
while (m.find()) {
    System.out.println(m.group(1));
}

您不必再在
at
之前匹配空格,但您可能希望使用
\b
(单词边界)来避免部分单词匹配(例如,我的猫在市中心的波士顿)。通常最好使用
\s+
而不是文字空格,以防有多个空格,或者空格实际上是一个制表符或其他东西。

这是一个好主意。您在[whitespace][word]处匹配整个,但单词在(),因此您只返回group的单词。当然,如果你说“我在球场上”,你会遇到问题,因为这将匹配“在”并返回“the”。+1;我真的希望Java能做“中间捕获”(这就是他们所说的吗?)。我想这是C#做的。而且它还可以执行无限查找,我现在已经知道了如何在Java中非常可靠地使用它。而且,这仍然会错过一些东西,比如
“我在波士顿”
,但这可能没问题。@poly,打得好。但是它很容易修复:
“\\bat\\s+((?!at\\b)\\w+”
。是的,.NETregex风格支持中间捕获。据我所知,唯一支持它们的另一种风格是Perl。