我有一个输入字符串,格式如下
String input = "00IG356001110002005064007000000";
字符3-7是代码。
字符8-12是金额。
根据输入字符串中的代码(示例输入字符串中的IG356),我需要捕获量(样本中的00111)。 应仅为特定代码选取金额(字符8-12)中的值,逻辑详述如下。
一个。如果代码不是SG356,请检查代码是IG902还是SG350,在这种情况下捕获量(00111)
否则
湾检查代码中的3个数字(本示例中的字符5-7,356)。如果他们是200,201,356,370。继续并获取金额
我正在使用如下所示的正则表达式: 使用积极的先行,如果然后构建。
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);
}
答案 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));
}