首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果存在成对大括号,则只允许特定的字符串正则表达式。

如果存在成对大括号,则只允许特定的字符串正则表达式。
EN

Stack Overflow用户
提问于 2019-12-16 15:59:46
回答 1查看 51关注 0票数 1

我试图验证用户输入的令牌。

我的规则是,如果用户在双大括号之间输入一个字符串,{{myToken}}则只允许在它们之间放置特定的单词。对于这个例子,让我们假设“狗”和“猫”是有效的,但是对于大括号中的任何其他字符串都无效。如果不存在大括号,则允许任何字符串。

我发现写一个简单的狗或猫是很容易的。

测试句1:

  • “我拥有{{狗}和{猫}}但不是鱼”-- 有效

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

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

测试句2:

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

最后,这句话应该是无效

测试句3:

  • “我拥有一个{{牛}}”--无效
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-16 16:26:54

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

  • 不含双花括号:{{...}}我有一条鱼
  • 包含一个或多个具有以下内容的双花括号:{{dog}} {{cat}} i拥有{{狗}和{cat}但不包含fish

上述内容不匹配的任何内容都应视为无效:

我拥有一个{cow}}

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

方法1-回火贪婪令牌

您可以对脾气暴躁的象征进行交替扩展,以匹配指定的双花括号:

参见此处使用的regex

代码语言:javascript
运行
复制
^(?:(?!{{2}).|{{2}(?:dog|cat)}{2})+$

它的工作原理:

  • ^在行开始处的断言位置
  • (?:(?!{{2}).|{{2}(?:dog|cat)}{2})+回火贪婪令牌匹配以下一次或多次
    • (?!{{2}).负前瞻确保以下内容不是{{,如果不是,则匹配字符(.匹配除换行符以外的任何内容--如果需要匹配换行符,则将.更改为[\s\S]或启用s修饰符)
    • {{2}(?:dog|cat)}{2}匹配{{dog}}{{cat}}

  • $断言在行尾的位置

方法2-简单交替

您可以使用相当简单的替换来替换上面经过调整的贪婪令牌所做的事情:

参见此处使用的regex:(注意,该链接在第一个字符集中有\n以供显示)

代码语言:javascript
运行
复制
^(?:[^{]|{(?!{)|{{2}(?:dog|cat)}{2})+$

它的工作原理:

  • ^在行开始处的断言位置
  • (?:[^{]|{(?!{)|{{2}(?:dog|cat)}{2})+再匹配一次
    • [^{]匹配除{以外的任何字符
    • {(?!{)匹配{,如果它后面没有{ (例如,如果您有类似于{this}的东西,它将允许它匹配)
    • {{2}(?:dog|cat)}{2}匹配{{dog}}{{cat}}

  • $断言在行尾的位置
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59360137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档