Java正则表达式提取两个字符串之间的内容

6

问题

我有一个类似于“提名 ? 个奥斯卡金像奖”或“提名 2 个金球奖。提名 ? 个奥斯卡金像奖。30 次获胜,18 次提名”的模式。我想用正则表达式确定问号所代表的奥斯卡数量。

我的尝试

根据以下问题:如何在 Java 中提取两个字符串之间的内容?如何找到两个字符串之间的值? 我尝试了以下模式:

final Pattern pattern = Pattern.compile("for(.*?)Oscar");

接下来,我尝试了以下这个问题:Java - 最佳方法获取两个字符串之间的所有字符串?(使用正则表达式?)

  final Pattern pattern = Pattern.compile(Pattern.quote("Nom") +"(.*?)"+ Pattern.quote("Oscar"));

我的剩余代码如下:
final Matcher matcher = pattern.matcher("Nom for 3 Oscar");
    while(matcher.find()){

    }
Log.d("Test", matcher.group(1));

所有这些模式都会导致以下异常:

java.lang.IllegalStateException: No successful match so far

我想我可能只是忽略了一些非常简单的事情。
你们能帮帮我吗?

编辑


所以问题是,我在循环后调用了matcher.group(1)。我误解了find方法的工作原理。然而,当我在循环内调用matcher.group(1)时,这段代码确实有效。
   final Pattern pattern = Pattern.compile("for(.*?)Oscar");
    final Matcher matcher = pattern.matcher("Nom for 3 Oscar");
        while(matcher.find()){
         Log.d("Test", matcher.group(1));
        }
3个回答

8

我写了一个测试代码,就像在Java中提取两个字符串之间的内容,它能够正常运行。我认为你的输入的字符串不匹配:

 @Test
        public void regex() {
            String str = "Nom for 3 Oscar, dom for 234235 Oscars";
            Pattern pattern = Pattern.compile("for(.*?)Oscar");
            Matcher matcher = pattern.matcher(str);
            while (matcher.find()) {
                System.out.println(matcher.group(1));
            }
        }

输出:

    3 
 234235 

在我回答问题后,您编辑了问题并且我发现在您的输入字符串中,“oscar”以小写“o”开头,在模式中以大写“O”开头。

1
尝试使用这个模式:
\w+\s+\w+\s(\d+)\s\w+

尝试一下这个:

String str = "Nom for 3 Oscar";
Pattern pattern = Pattern.compile("\\w+\\s+\\w+\\s+(\\d+)\\s+\\w+");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
    Log.d("Test", matcher.group(1));
}

为什么只允许在数字周围留一个空格,但是在“Nom”和“for”之间可以有1个或多个空格? - Andreas
无法编译此代码,因为出现了非法的转义字符错误。 - Mayr Technologies
@Andreas 这是一个打字错误。已经修改。 - K Neeraj Lal
谢谢您的帮助 :) 不幸的是,到目前为止我仍然遇到了 IllegalStateException,并没有成功匹配。 - Mayr Technologies

0

尝试使用这个模式:

"\\w+\\s+\\w+\\s+(\\w+)\\s+\\w+"

测试代码:

String str = "Nom for you Oscar";
Pattern pattern = Pattern.compile("\\w+\\s+\\w+\\s+(\\w+)\\s+\\w+");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
    System.out.println(matcher.group(1));
}

你想要拦截第三方字符串吗?

我编辑了我的问题 :) 是的,我也想拦截其他字符串。谢谢你的帮助!不幸的是,这段代码不起作用 :( - Mayr Technologies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接