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

Java Regex Extract String between two Strings

问题

我有这样的模式 "Nom for ? oscars" 或 "Nom for 2 Golden Globes. Nom for ? oscars. 30 wins 18 nominations" 我想确定 ?使用正则表达式,所以奥斯卡的数量。

我试过的

好像有

对应本题:Extract string between two strings in java

How do I find a value between two strings? 我试过这个模式:

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

接下来我尝试了这个问题:Java - Best way to grab ALL Strings between two Strings? (regex?)

  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));
        }

试试这个模式,

\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));
}

试试这个模式:

"\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));
}

是否要截取第三个字符串?

我按照 Extract string between two strings in 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".