首页 > 解决方案 > 正则表达式继续匹配相似的模式

问题描述

我有 JCL 语句要与正则表达式模式匹配该语句如下所示

//name JOB optionalParam,keyword=param,keyword=param,keyword=param

实际声明如下

//ADBB503  JOB ,MSGCLASS=2,CLASS=P 

//ABCD JOB Something,MSG=NTNG,CLASS=ABC

我尝试了一个正则表达式来分组匹配,但是最后一个关键字和参数将有 n 次我需要继续匹配直到它存在。

String regex= (\/\/)(\w+)(\s+)(JOB)(\s+)(\w+)?(,)([\w+=\w+]+);

我的试用版在下面给出的链接中 https://regex101.com/r/gUyRMV/1

我面临的错误是只有一个关键字=参数匹配。N个关键字和参数需要匹配。

标签: javaregex

解决方案


您可以匹配第一个捕获组中的作业语句并使用\G来获取第 2 组中的参数:

(?:(//\w+\s+JOB(?: \w+)?)\h*|\G(?!^)),(\w+=\w+)

解释

  • (?:非捕获组
    • (捕获组 1
      • //\w+\s+JOB匹配//,1+字字符和JOB
      • (?: \w+)?匹配可选参数
    • )\h*` 关闭组并匹配 0+ 个水平空白字符
    • |或者
    • \G(?!^)在上一场比赛结束时断言位置,而不是在开始时
  • ), 关闭非捕获组并匹配,
  • (捕获组 2
    • \w+=\w+匹配 1+ 单词字符=1 + 单词字符
  • )关闭组

在java中

String regex = "(?:(//\\w+\\s+JOB(?: \\w+)?)\\h*|\\G(?!^)),(\\w+=\\w+)";

正则表达式演示| Java 演示


推荐阅读