捕获组使用If然后在java中使用正则表达式构造

时间:2012-01-31 11:43:45

标签: java regex

我有一个输入字符串,格式如下

String input = "00IG356001110002005064007000000";

字符3-7是代码。

字符8-12是金额。

根据输入字符串中的代码(示例输入字符串中的IG356),我需要捕获量(样本中的00111)。 应仅为特定代码选取金额(字符8-12)中的值,逻辑详述如下。

  1. 代码不应该是SG356。如果是SG356,则不匹配并退出。
  2. 一个。如果代码不是SG356,请检查代码是IG902还是SG350,在这种情况下捕获量(00111)

    否则

    湾检查代码中的3个数字(本示例中的字符5-7,356)。如果他们是200,201,356,370。继续并获取金额

  3. 我正在使用如下所示的正则表达式: 使用积极的先行,如果然后构建。

    String regex= ".{2}(?!SG356)((?=IG902|SG350).{5}(.{5}).+|.{2}(?=200|201|356|370).{3}(.{5}).+)";
    

    如果输入字符串中的代码是IG902或SG350(当正则表达式的“if”部分匹配时),正则表达式工作正常。但如果“其他”匹配,我无法捕获金额。

    这个正则表达式在检查匹配时工作正常。

    .{2}(?!SG356)((?=IG902|SG350).+|.{2}(?=200|201|356|370).+) 
    

    问题出在捕获群体时。 我在Java中运行它。任何帮助将不胜感激。

    我使用的java代码是:

    public String getTsqlSum(String input, String regex){
         String value = null;
         Matcher m = Pattern.compile(regex).matcher(input);
         System.out.println("Group Count: " + m.groupCount());
         if (m.matches()) {
        for (int i=0;i<m.groupCount();i++){
            System.out.println("For i: " + i +" Value: " + m.group(i));
             }
         }
         return value;
    }
    
    public void forumTest(){
        //String input = "00IG902001110002005064007000000";
             String input = "00IG356001110002005064007000000";
        String regex= ".{2}(?!SG356)(?:(?=IG902|SG350).{5}|.{2}(?=200|201|356|370).{3})(.{5}).+";
        System.out.println(match(input, regex));
        String match = getTsqlSum(input, regex);
        System.out.println("Match: " + match);
    }
    

1 个答案:

答案 0 :(得分:2)

  

如果输入字符串中的代码是IG902或SG350(当正则表达式的“if”部分匹配时),正则表达式工作正常。但如果“其他”匹配,我无法捕获金额。

你无法捕捉数量,表达式正常。但是如果你处于交替的第二部分(这不是正则表达式if-then-else)那么你的结果是在一个不同的捕获组中。您将在捕获组 3 中找到它,而不是在第二个捕获组中找到它,就像您在交替的第一部分中匹配一样。

String regex= ".{2}(?!SG356)((?=IG902|SG350).{5}(.{5}).+|.{2}(?=200|201|356|370).{3}(.{5}).+)";
        Group number        1                   2                                   3

在正则表达式中,捕获组由其左括号编号,并且这也在交替中继续。在Perl中,有一个构造可以为交替的捕获组提供相同的数字,但我认为这是唯一能够做到这一点的风格。

在Java中,您需要检查具有结果的组中的表达式。

请参阅我的回答here,类似主题

您可以更改正则表达式并在捕获组之前进行更改

试试这个

.{2}(?!SG356)(?:(?=IG902|SG350).{5}|.{2}(?=200|201|356|370).{3})(.{5}).+

您将在第1组中的两种情况下找到结果。(我使用?:使第一个成为非捕获组)

添加来源后更新

你的循环错误,这意味着小组的开头是 1 ,如果你想要第一组的内容,你必须使用m.group(1)

在组m.group(0)中,您将找到整个匹配的字符串。

试试这个

for (int i=1;i<=m.groupCount();i++){
    System.out.println("For i: " + i +" Value: " + m.group(i));
}