捕获组中的Java正则表达式

时间:2019-02-08 13:34:59

标签: java

  import java.util.regex.Matcher;
  import java.util.regex.Pattern;


  public class RegexMatches {

   public static void main(String args[]) {
    // String to be scanned to find the pattern.
    String line = "This order was placed for QT3000! OK?";
    String pattern = "(.*)(\\d+)(.*)";

    // Create a Pattern object
    Pattern r = Pattern.compile(pattern);

    // Now create matcher object.
    Matcher m = r.matcher(line);
    if (m.find()) {
     System.out.println("Found value: " + m.group(0));
     System.out.println("Found value: " + m.group(1));
     System.out.println("Found value: " + m.group(2));
    } else {
     System.out.println("NO MATCH");
    }
   }
  }

输出

  

发现值:该订单是QT3000的下订单!好吗?
  实测值:该订单是针对QT300的订单
  发现值:0

请使用Java正则表达式理解此代码。

3 个答案:

答案 0 :(得分:0)

我认为您想从给定的字符串中提取一个数字。

Pattern pattern = Pattern.compile("(?<prefix>\\D*)(?<number>\\d+)(?<suffix>\\D*)");
Matcher matcher = pattern.matcher("This order was placed for QT3000! OK?");

if (matcher.matches()) {
    System.out.println("Prefix: " + matcher.group("prefix"));  // Prefix: This order was placed for QT
    System.out.println("Number: " + matcher.group("number"));  // Number: 3000
    System.out.println("Suffix: " + matcher.group("suffix"));  // Suffix: ! OK?
} else
    System.out.println("NO MATCH");

如果要捕获整个字符串,则应使用Matcher.matcher()检查正则表达式

if(matcher.matches()) {
    // string matches with regular expression
} else {
    // string does not match with regular expression
}

如果要查找多个匹配项,则应使用Matcher.hasNext()

while (matcher.matches()) {
    // next match found
}

Demo at www.regex101.com

答案 1 :(得分:0)

首先,正如Aron所解释的,正则表达式引擎按第一组匹配所有输入字符串。其次,它回溯到找到与第二组匹配的字符串部分,第二组只需满足一位数字即可。最终,字符串的其余部分将与最后一个组(第3个)匹配。

现在根据示例代码考虑以下代码,其中对模式进行一些更改,并再添加一个打印语句:

String line = "This order was placed for QT3000! OK?";
String pattern = "(.*)(\\d{4})(.*)";

Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(line);
if (m.find()) {
 System.out.println("Found value: " + m.group(0));
 System.out.println("Found value: " + m.group(1));
 System.out.println("Found value: " + m.group(2));
 System.out.println("Found value: " + m.group(3));
} else {
 System.out.println("NO MATCH");
}

打印添加的语句:m.group(0)等同于m.group(),这意味着在给定的输入字符串中返回给定模式的所有匹配项。通过使用这种模式,我们也可以拥有其他三个组索引。因此,通过打印整个组,可以通过将该模式应用于该字符串来帮助我们找出当前正在发生的情况。

模式更改:模式中的更改可以确认断言有关Java regex引擎如何作用于原始语句的声明。因此,新模式可以选择输入字符串中存在的所有数字,并且输出将更改为以下一位:

  

发现值:该订单是QT3000的下订单!好吧

     

发现值:此订单已进行QT

     

发现值:3000

     

发现值:!好吧

答案 2 :(得分:0)

您可以使用Scanner类来解析文本字符串内的整数。我还添加了实用程序方法来增长和适合数组。

import java.util.*;

public class NumberExtractor {
    public static void main(String[] args) {
        String test = "This order was placed for QT3000! OK?";
        int[] numbers = extractNumbers(test);
        System.out.println(Arrays.toString(numbers)); // [ 3000 ]
    }

    public static int[] extractNumbers(String str) {
        return extractNumbers(str, 10);
    }

    public static int[] extractNumbers(String str, int defaultSize) {
        int count = 0;
        int[] result = new int[defaultSize];
        Scanner scanner = new Scanner(str);
        scanner.useDelimiter("[^\\d]+"); // Number pattern
        while (scanner.hasNextInt()) {
            if (count == result.length) {
                result = growArray(result, 1.5f);
            }
            result[count++] = scanner.nextInt();
        }
        scanner.close();
        return clipArray(result, count);
    }

    private static int[] growArray(int[] original, float growthPercent) {
        int[] copy = new int[(int) (original.length * growthPercent)];
        System.arraycopy(original, 0, copy, 0, Math.min(original.length, copy.length));
        return copy;
    }

    private static int[] clipArray(int[] original, int length) {
        return clipArray(original, 0, length);
    }

    private static int[] clipArray(int[] original, int start, int length) {
        int[] copy = new int[length];
        System.arraycopy(original, start, copy, 0, length);
        return copy;
    }
}