正则表达式匹配多个 if then else 条件

Regex to match multiple if then else condition

我正在尝试匹配 JCL 作业语句的正则表达式模式 可以采用以下格式

//职位名称 JOB
//jobname JOB AccountInfo,'PGMR name',keyword=param,keyword=param,keywod=param

//jobname JOB ,keyword=param,keyword=param

//工作名称 JOB(账户信息)

//职位名称 JOB 'pgmrname'

//职位名称职位账户信息

结构解释如下

//职位名称 > 必填字段

帐户信息是可选的,可以在两天后退出 accountinfo 或 (accountinfo)

PGMR 名称是可选的,看起来像这样 'myname'

关键字参数可选,成对出现 MSGCLASS=1,CLASS=P

正在寻找匹配正则表达式以匹配以上所有可选组合

我试过使用 ?= if then else 条件但不工作 下面给出的正则表达式

 \/\/\w+\s+JOB\s+(?:(?=(\w+|'\w+')(,\w+)|\w+))?(,(\w+=\w+))$

visualization of rgex conditon

上面给出了我的正则表达式的可视化

匹配和不匹配的字符串在下面的跟踪演示中给出 无法达到要求的结果。 https://regex101.com/r/CdpB9c/2

我认为您试图解释的内容中缺少某些内容:

是否需要捕获组来提取信息? 您一次需要 select 一行吗?

如果您只需要捕获以 \jobname JOB PARAMS 开头的所有内容,那么您可以简单地说:\/\/.*JOB\s*.* 但我几乎可以肯定情况并非如此,并且缺少其他一些解释。

如果您需要获取作业字符串的一部分并将其拆分为捕获组,这样的事情可能是一个很好的起点:

\/\/(.*) JOB (('[a-zA-Z]*')*|(\([a-zA-Z]*\))*|([a-zA-Z]*=[a-zA-Z]*)|(,)|([a-zA-Z]*))*(\n|$)

我认为它需要一些润色,但它会将大多数情况提取到单独的组中。

要获得示例的完全匹配,您可以使用 \G 锚点:

^(//\w+\s+JOB[^,\r\n]*(?:,(?:[^,=\r\n]*,)?)?)(\w+=\w+(?:,\w+=\w+)*)?

我创建了捕获组来获取两个不同的部分,这些也可以省略。

  • ^ 字符串开头
  • ( 捕获 组 1
    • //\w+\s+JOB[^,\r\n]* 匹配开头包括 JOB,然后不匹配换行符或 ,
    • (?:,(?:[^,=\r\n]*,)?)? 可选择匹配 , 和不带 =,
    • 的可选部分
  • )
  • ( 捕获 第 2 组
    • \w+=\w+(?:,\w+=\w+)*匹配由单词字符组成的key=value对
  • )? 关闭组并使其可选,因为它并不总是存在

Regex demo

要获得单独的部分,您可以使用 \G 锚点:

  • (?: 非捕获组

    • ^//\w+\s+JOB\h* 匹配字符串的开头直到 JOB 和 0+ 个水平空白字符
    • (?:[^\s=]+)? 可选择匹配除空白字符或 =
    • 之外的任何字符
    • (?:,|$) 匹配 , 或字符串结尾
    • |
    • \G(?!^) 在上一场比赛结束时声明位置,而不是在开始时
  • )关闭非捕获组
  • (?:\w+=\w+)? 可选匹配由单词字符组成的 key=value 部分

Regex demo