为了账号安全,请及时绑定邮箱和手机立即绑定

重复正则表达式

重复正则表达式

明月笑刀无情 2022-09-07 21:34:48
我有一个要解析的日志文件。它是关于使用正则表达式获取方括号之间和“OK:”之后的值。问题是我不知道模式发生了多少次,我不能说每个代码有多长。所以我只能转述它被“[OK:”和“]”包围的事实。到目前为止,我试图在这里使用这个模式作为正则表达式:String ok_pattern = "(.*itId=<)(.{1,10})(>.*)(\\[OK:)(.{4,27})(].*)";Pattern p_ok = Pattern.compile(ok_pattern);String testString = "RANDOMTEXT itId=<1232> Code < [OK:AZ1000105]  [OK:10000006] [OK:F1000000007] > RANDOMTEXT";Matcher m = p_ok.matcher(testString);if(m.find()) {    System.out.println(m.group(5));}但这仅适用于只有一个“[OK:...]”的情况。我在第5组之后尝试使用“*”和“+”,但我无法成功。我如何重复进行此操作并仍然捕获所有结果?我的目标是使用正则表达式在“OK:”之后提取 itemId 和(char-)数字组合。因此,在此示例中,我想获取“1232”(ItemID)和“AZ1000105”,“10000006”,“F1000000007”。我感谢每一个帮助!
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

您的基本设置是正确的,但您的模式与理想模式有些偏差。尝试使用以下正则表达式模式:


(?<=\[OK:)[^\]]+|(?<=itId=<)[^>]+

这仍然使用一个观察,但它只断言前面的是 。然后,它甚至在不使用捕获组的情况下,匹配任何数量的字符,这些字符不是右方括号。这对应于您尝试查找的内容。交替项右侧的部分与值匹配。[OK:itId


String ok_pattern = "(?<=\\[OK:)[^\\]]+|(?<=itId=<)[^>]+";

Pattern p_ok = Pattern.compile(ok_pattern);

String testString = "RANDOMTEXT itId=<1232> Code < [OK:AZ1000105]  [OK:10000006] [OK:F1000000007] > RANDOMTEXT";


Matcher m = p_ok.matcher(testString);

while (m.find()) {

    System.out.println(m.group(0));

}


1232

AZ1000105

10000006

F1000000007


查看完整回答
反对 回复 2022-09-07
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

如果你想捕获 中的数字,然后以该顺序捕获后面的内容,你可以利用锚点来断言上一场比赛结束时的位置。itId=<1232>OK:\G

匹配第一个捕获组中的数字和第二个捕获组中的值:itIdOK:

itId=<(\d+)> Code < |\G(?!^)\[OK:([A-Z0-9]+)\]\s*

在爪哇:

String ok_pattern = "itId=<(\\d+)> Code < |\\G(?!^)\\[OK:([A-Z0-9]+)\\]\\s*";

解释

  • itId=<(\d+)> Code <匹配第一部分并在组 1 中捕获 1 位以上数字

  • |

  • \G(?!^)上一场比赛结束,而不是在开始时

  • \[OK:([A-Z0-9]+)\]\s*Match ,然后在组 2 中捕获您的值并进行匹配,后跟 0 个以上的空格字符[OK:]

正则表达式演示|Java 演示

请注意,如果要匹配更多,也可以使用否定字符类来匹配而不是方括号([A-Z0-9]+)([^]]+)

例如,您可以检查组是否存在:

String ok_pattern = "itId=<(\\d+)> Code < |\\G(?!^)\\[OK:([^]]+)\\]\\s*";

Pattern p_ok = Pattern.compile(ok_pattern);

String testString = "RANDOMTEXT itId=<1232> Code < [OK:AZ1000105]  [OK:10000006] [OK:F1000000007] > RANDOMTEXT";

Matcher m = p_ok.matcher(testString);


while(m.find()) {

    if (null != m.group(1)) {

        System.out.println("itId: " + m.group(1));  

    }

    if (null != m.group(2)) {

        System.out.println("Ok code: " + m.group(2));   

    }   

}


查看完整回答
反对 回复 2022-09-07
  • 2 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号