正则表达式匹配多个 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对
)?
关闭组并使其可选,因为它并不总是存在
要获得单独的部分,您可以使用 \G
锚点:
(?:
非捕获组
^//\w+\s+JOB\h*
匹配字符串的开头直到 JOB 和 0+ 个水平空白字符
(?:[^\s=]+)?
可选择匹配除空白字符或 =
之外的任何字符
(?:,|$)
匹配 ,
或字符串结尾
|
或
\G(?!^)
在上一场比赛结束时声明位置,而不是在开始时
)
关闭非捕获组
(?:\w+=\w+)?
可选匹配由单词字符组成的 key=value 部分
我正在尝试匹配 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对
)?
关闭组并使其可选,因为它并不总是存在
要获得单独的部分,您可以使用 \G
锚点:
(?:
非捕获组^//\w+\s+JOB\h*
匹配字符串的开头直到 JOB 和 0+ 个水平空白字符(?:[^\s=]+)?
可选择匹配除空白字符或=
之外的任何字符
(?:,|$)
匹配,
或字符串结尾|
或\G(?!^)
在上一场比赛结束时声明位置,而不是在开始时
)
关闭非捕获组(?:\w+=\w+)?
可选匹配由单词字符组成的 key=value 部分