如果存在配对的花括号,则仅允许使用特定的字符串正则表达式

时间:2019-12-16 15:59:46

标签: javascript regex

我正在尝试验证用户输入的令牌。

我的规则是,如果用户在双括号之间输入字符串{{myToken}},则只能在它们之间放置特定的单词。对于此示例,假设“ dog”和“ cat”有效,但对括号内的其他任何字符串无效。如果没有大括号,则允许使用任何字符串。

我发现编写一个易于检测的狗或猫非常容易。

测试句子1:

  • “我拥有{{dog}}和{{cat}},但没有一条鱼” – 有效

/{{(dog|cat+?)}}/g

但是,我仍然希望这句话也有效

测试语句2:

  • “我拥有一条鱼”-有效

最后,这句话应该无效

测试语句3:

  • “我拥有一个{{cow}}” –无效

1 个答案:

答案 0 :(得分:3)

目前尚不清楚您要匹配的是什么,但是如果遵循以下规则,我假设它是整个字符串:

  • 不包含双大括号:{{...}}
      

    我拥有一条鱼

  • 包含一个或多个带有以下内容的双花括号:{{dog}} {{cat}}
      

    我拥有{{dog}}和{{cat}},但不钓鱼

与上述内容不符的任何内容均应视为无效:

  

我拥有一个{{cow}}


有几种匹配这些字符串的方法。

方法1-强化贪婪令牌

您可以将tempered greedy token进行扩展以匹配指定的双大括号:

See regex in use here

^(?:(?!{{2}).|{{2}(?:dog|cat)}{2})+$

工作原理:

  • ^在行的开头断言位置
  • (?:(?!{{2}).|{{2}(?:dog|cat)}{2})+调节的贪婪令牌与以下一次或多次匹配
    • (?!{{2}).否定前瞻,确保后面没有{{,如果不是,则匹配该字符(.匹配除换行符以外的所有字符-如果需要匹配换行符,将.更改为[\s\S]或启用s修饰符)
    • {{2}(?:dog|cat)}{2}匹配{{dog}}{{cat}}
  • $在行尾声明位置

方法2-简单交替

您可以使用一个非常简单的替代方法来替换上面的脾气暴躁的令牌所做的事情:

See regex in use here :(请注意,该链接的第一个字符集中有\n以便显示)

^(?:[^{]|{(?!{)|{{2}(?:dog|cat)}{2})+$

工作原理:

  • ^在行的开头断言位置
  • (?:[^{]|{(?!{)|{{2}(?:dog|cat)}{2})+再匹配以下一次
    • [^{]匹配除{以外的任何字符
    • {(?!{)如果不跟{,则匹配{(例如,如果您有{this}之类的东西,它将允许匹配)
    • {{2}(?:dog|cat)}{2}匹配{{dog}}{{cat}}
  • $在行尾声明位置