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。