Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中使用If-then-else正则表达式构造捕获组_Java_Regex - Fatal编程技术网

在java中使用If-then-else正则表达式构造捕获组

在java中使用If-then-else正则表达式构造捕获组,java,regex,Java,Regex,我有一个以下格式的输入字符串 String input = "00IG356001110002005064007000000"; 字符3-7是代码 字符8-12为金额 根据输入字符串中的代码(示例输入字符串中的IG356),我需要捕获金额(示例中的00111)。 金额中的值(字符8-12)仅适用于特定代码,逻辑如下所述 代码不应为SG356。如果是SG356,则不匹配并退出 a。如果代码不是SG356,检查代码是IG902还是SG350,在这种情况下,捕获金额(00111) 否则 b。检查代码

我有一个以下格式的输入字符串

String input = "00IG356001110002005064007000000";
字符3-7是代码

字符8-12为金额

根据输入字符串中的代码(示例输入字符串中的IG356),我需要捕获金额(示例中的00111)。 金额中的值(字符8-12)仅适用于特定代码,逻辑如下所述

  • 代码不应为SG356。如果是SG356,则不匹配并退出
  • a。如果代码不是SG356,检查代码是IG902还是SG350,在这种情况下,捕获金额(00111)

    否则

    b。检查代码中的3个数字(本示例中的字符5-7356)。如果他们是200201356370。继续并获取数量

  • 我使用的正则表达式如下所示: 使用正向前瞻和if-then-else构造

    String regex= ".{2}(?!SG356)((?=IG902|SG350).{5}(.{5}).+|.{2}(?=200|201|356|370).{3}(.{5}).+)";
    
    如果输入字符串中的代码是IG902或SG350(当正则表达式的“if”部分匹配时),则正则表达式可以正常工作。但如果“else”匹配,我就无法捕捉到数量

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

    .{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);
    }
    
    publicstringgettsqlsum(字符串输入,字符串正则表达式){
    字符串值=null;
    Matcher m=Pattern.compile(regex).Matcher(input);
    System.out.println(“组计数:+m.groupCount());
    如果(m.matches()){
    对于(int i=0;i
    如果输入字符串中的代码是IG902或SG350(当正则表达式的“if”部分匹配时),则正则表达式可以正常工作。但是如果“else”匹配,则无法捕获金额

    您并不是无法捕获金额,表达式工作正常。但是如果您在替换的第二部分(这不是正则表达式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中,需要在得到结果的组的表达式之后进行检查

    见我的答案,类似的话题

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

    试试这个

    .{2}(?!SG356)(?:(?=IG902|SG350).{5}|.{2}(?=200|201|356|370).{3})(.{5}).+
    
    您将在组1中找到这两种情况下的结果。(我使用
    ?:
    将第一个设置为非捕获组)

    添加源后更新

    您的循环错误,这意味着组开始于1,如果您想要组1的内容,必须使用
    m.group(1)

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

    试试这个

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

    用于(int i=1;我为什么使用
    regex
    ?因为
    字符串的格式是固定的,使用
    String
    操作会更简单。是的,我同意使用字符串操作很容易做到这一点。但我使用的是java中的自定义工具。因此,我必须使用regex。在一些风格中,如.NET和JGSoft,您也可以使用命名captu使用相同名称的环组。您好,Stema。感谢您的查看。这里的Groupcount是3。但是我得到的值为null,对于第三个组。对于i:0值:00IG35600111000200506407000000对于i:1值:IG35600111000200506407000000对于i:2值:null,我无法找出为什么第三个组的值为null。另外,这不是需要编写if-then-else的方式吗?(请参考您的语句(这不是正则表达式if-then-else))。@构造
    (abc | def)
    是一种替代(OR)。这意味着:尝试匹配第一部分,如果不匹配,请尝试第二部分,如果不匹配,请尝试第三部分…好的。谢谢Stema。但是,您提供的正则表达式在匹配第三部分时也不会返回值。此外,输入字符串可以是各种形式,可以匹配第一部分、第二部分或第三部分。因此,如果字符串是00IG35600111000200506407000000(匹配第三部分)或00IG90200111000200506407000000(匹配第二部分)。这两种情况下,我都需要获取值。