使用regex将输入参数从字符串中提取到参数和值组中

6bc51xsx  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(119)

我需要帮助使用正则表达式将字符串中的这些参数提取/拆分为参数和值组。

Input -> collection_a=['U1', 'U2'], collection_b=['U1', 'U2']

output -> Group Parameter = collection_a
          Group Value = ['U1', 'U2']

          Group Parameter = collection_b
          Group Value = ['U1', 'U2']
Input -> collection=['U1', 'U2'], callback_macro=utils.user_email(user_id=$$)

output -> Group Parameter = collection
          Group Value = ['U1', 'U2']

          Group Parameter = callback_macro
          Group Value = utils.user_email(user_id=$$)
Input -> collection=['U1', 'U2'], callback_macro=utils.user_email(user_id=$$, config={'user': 'ADMIN'})

output -> Group Parameter = collection
          Group Value = ['U1', 'U2']

          Group Parameter = callback_macro
          Group Value = utils.user_email(user_id=$$)
Input -> collection=['U1','U2'], callback_macro=string.replace(value=$$, pattern=^(.*)$, replacement={'user': $1})

output -> Group Parameter = collection
          Group Value = ['U1', 'U2']

          Group Parameter = callback_macro
          Group Value = string.replace(value=$$, pattern=^(.*)$, replacement={'user': $1})

我正在使用这个正则表达式/((\s*(?<parameter>[a-z_]+)\s*=\s*(?<value>((?!(,\s*[a-z_]+)\s*=\s*).)*)),{1,})/g,它在情况1和情况2中工作得很好,但在情况3和4中会中断,因为在情况3和4中,它在参数的值中包含=
正则表达式链接-https://regex101.com/r/U2CaLb/1

wd2eg0qa

wd2eg0qa1#

很难将这些需求分开。
你可以只匹配 key/value 并将它们放入数组中。
注意,第三个输入样本不遵循其他模式。
这里有一些选项可供选择。

***方法1***此正则表达式使用单级大括号匹配作为其一部分。

(\w+)=((?:\[.*?\]|\(.*?\)|{.*?}|[^,\r\n])*)

https://regex101.com/r/fnPb6e/1

( \w+ )                       # (1)
 =
 (                             # (2 start)
    (?:
       \[ .*? \] 
     | \( .*? \) 
     | { .*? } 
     | 
       [^,\r\n] 
    )*
 )                             # (2 end)

对于 * 平衡大括号文本 *、PCRE或Not-Net引擎:

***方法二***此正则表达式是()[]{}的简单嵌套版本

其中独立地找到平衡端以完成。

(\w+)=((?:(\[(?:[^\[\]]++|(?3))*\])|(\((?:[^()]++|(?4))*\))|({(?:[^{}]++|(?5))*})|[^,\r\n])*)

https://regex101.com/r/dgWMDZ/1

( \w+ )                       # (1)
 =
 (                             # (2 start)
    (?:
       (                             # (3 start)
          \[
          (?:
             [^\[\]]++ 
           | (?3)
          )*
          \]
       )                             # (3 end)
     | (                             # (4 start)
          \(
          (?:
             [^()]++ 
           | (?4)
          )*
          \)
       )                             # (4 end)
     | (                             # (5 start)
          {
          (?:
             [^{}]++ 
           | (?5)
          )*
          }
       )                             # (5 end)
     | [^,\r\n]
    )*
 )                             # (2 end)

***方法3***这个正则表达式会平衡嵌套在里面的不同大括号

这将允许更多的内部支撑结构
项,并且在此场景中可能不需要,但将来可能需要。
这是增强的 * 方法2* 版本,包含该功能。

(\w+)=((?:(\[(?:[^\[\](){}]++|(?3))*\]|\((?:[^\[\](){}]++|(?3))*\)|{(?:[^\[\](){}]++|(?3))*})|[^,\r\n])*)

https://regex101.com/r/ZubSke/1

( \w+ )                       # (1)
 =
 (                             # (2 start)
    (?:
       (                             # (3 start)
          \[ 
          (?:
             [^\[\](){}]++ 
           | (?3) 
          )*
          \] 
        | 
          \( 
          (?:
             [^\[\](){}]++ 
           | (?3) 
          )*
          \) 
        | 
          {
          (?:
             [^\[\](){}]++ 
           | (?3) 
          )*
          }
       )                             # (3 end)
     | 
       [^,\r\n] 
    )*
 )                             # (2 end)

***方法4***与方法3相同,但增加了对简单单引号或双引号字符串的处理。

此正则表达式将混合在任何其他分隔符对中的引号解析中
平衡,以及这些分隔符之外。
请注意,有一个通过垃圾收集器[^,\r\n]的传递来获取catch unbalanced。
分隔符。这是设计好的,因为平衡的文本实际上只是充实过程中的一个建议。

(\w+)=((?:(\[(?:[^\[\](){}'"]++|(?4)|(?3))*\]|\((?:[^\[\](){}'"]++|(?4)|(?3))*\)|{(?:[^\[\](){}'"]++|(?4)|(?3))*})|('[^'\r\n]*?'|"[^"\r\n]*?")|[^,\r\n])*)

https://regex101.com/r/090iI7/1

( \w+ )                       # (1)
 =
 (                             # (2 start)
    (?:
       (                             # (3 start)
          \[ 
          (?:
             [^\[\](){}'"]++ 
           | (?4) 
           | (?3) 
          )*
          \] 
        | 
          \( 
          (?:
             [^\[\](){}'"]++ 
           | (?4) 
           | (?3) 
          )*
          \) 
        | 
          {
          (?:
             [^\[\](){}'"]++ 
           | (?4) 
           | (?3) 
          )*
          }
       )                             # (3 end)
     | (                             # (4 start)
          ' [^'\r\n]*? '
        | 
          " [^"\r\n]*? "
       )                             # (4 end)
     | 
       [^,\r\n] 
       
    )*
 )                             # (2 end)

相关问题