正则表达式允许我匹配除定义的子字符串之外的所有内容

问题描述 投票:0回答:1

我有以下字符串:

testInputs.abc_def.alpha=abc^ORtestVars.var23.nameISEMPTY^testInputs.alpha_bravo.more.otheroneCONTAINSsomething^testVars.anotherone!=abc^testVars.mYVar!=abc

我需要它来匹配

testInputs.abc_def.alpha
testVars.var23.name
testInputs.alpha_bravo.more.otherone
testVars.anotherone
testVars.mYVar

我可以匹配所有出现的情况,但问题是它还匹配一些不应该匹配的运算符:

空 包含

(还有很多其他的,比如 IN、NOT IN 等)

我有一个数组,可以连接它来创建替换,但问题是在没有禁止的子字符串的情况下保持匹配。就目前情况而言,而不是

testVars.var23.name

我最终

testVars.var23.nameISEMPTY

同样,我匹配

testInputs.alpha_bravo.more.otheroneCONTAINS

目前的规则是:

  • 匹配可以以
    testInputs.
    testVars.
  • 开头
  • 任何字母数字,无论大小写,以及下划线(_)和句点(.)
  • testInputs 或 testVars 之后的子字符串可以是任意长度
  • 一个字符串中可以有多个匹配项
  • 匹配也可以采用 {{var}} 的形式,例如 {{testInputs.myinput}}=abc 或 {{testVars.my_var}}ISEMPTY,但我已将上面的内容清除,以便更容易阅读。

到目前为止我已经尝试过以下方法:

(({{)?(?:testInputs\.|testVars\.)[a-zA-Z0-9_\.]+(}})?)

并尝试了前瞻/后瞻的一些变体

(?!CONTAINS|ISEMPTY)

但是未能成功排除无效子字符串,同时仍然匹配我正在寻找的匹配部分。

javascript regex regex-lookarounds
1个回答
0
投票

您可以将每个字符与否定查找头模式匹配,以排除已知关键字(随意添加更多):

(?:testInputs|testVars)\.(?:[\w.](?!ISEMPTY|CONTAINS|OR|IN|[^\w.]))*\w

演示:https://regex101.com/r/L14Te5/3

© www.soinside.com 2019 - 2024. All rights reserved.