gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:54:16 26 4
gpt4 key购买 nike

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

String input = "00IG356001110002005064007000000";

字符3-7是代码。

第 8-12 个字符是金额。

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

  1. 代码不应是 SG356。如果是SG356,则不匹配并退出。
  2. a。如果代码不是 SG356,请检查代码是否是 IG902 或 SG350,在这种情况下捕获金额(00111)

    其他

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

我正在使用如下所示的正则表达式:使用正向前瞻和 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);
}

最佳答案

The regular expression works fine if the code in the input string is IG902 or SG350 (when the 'if' part of the regex is getting matched). but if the 'else' is getting matched, i am unable to capture the amount.

您并非无法捕获金额,表达式工作正常。但是,如果您处于交替的第二部分(这不是正则表达式 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));
}

关于java - 在java中使用If then else正则表达式构造捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9078950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com