在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)仅适用于特定代码,逻辑如下所述
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)
在groupm.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(匹配第二部分)。这两种情况下,我都需要获取值。