正则表达式检查所有元素之间是否存在拆分器字符

时间:2018-04-04 12:06:44

标签: c# .net regex

我有一个正则表达式,我试图用来检测某个输入是否有效。输入的语法应为{A|B|C}{A|B|}应该失败。

(?:
 (
  \{{1}
  (?:[A-Z0-1-_.*]+ \| [A-Z0-1-_.*]+)*
  \}{1}
 )
)

这是我到目前为止所做的,但我开始认为这不是一条路。即使它确实正常工作,它也不会允许{A}有效。

所以基本上我要做的就是检查每个[A-Z0-1-_.*]元素是否被|拆分,并且{}括号内没有空元素。

我真正感到困惑的一个概念就是拥有大量可能的元素。就像我们说的那样,要验证的字符串是Foo{A}Bar{B|C}Test 我检查的方式有2个元素。检查字母字符的一个元素,以及检查括号中字符的另一个元素。 所以要检查上面的字符串,我会做alphaElem*|BracketElem*|alphaElem*|BracketElem*|alphaElem* 但是这很多都是写出来的,如果元素的数量增加,它就无法扩展。有什么办法可以用正则表达式解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

您可以使用

{[A-Z0-1-_.*]+(?:\|[A-Z0-1-_.*]+)*}

请注意,最后一个*修饰符可以替换为limiting quantifier。例如。 {0,2}匹配0,1或2次(匹配{...}内的1,2或3个元素)。

请参阅regex demo

<强>详情

  • { - {字符
  • [A-Z0-1-_.*]+ - 在字符类中定义的一个或多个字符(大写ASCII字母,01-_,{{1 }或.字符)
  • * - non-capturing group匹配0次或多次:
    • (?: - \|字符
    • | - 在字符类
    • 中定义的1个或多个字符
  • [A-Z0-1-_.*]+ - 分组构造的结尾
  • )* - }字符。

请注意,您不需要在.NET正则表达式中转义}{个字符,它是“智能”的,足以将}解析为文字{之前没有与{em> { } 值匹配的min

答案 1 :(得分:0)

此解决方案将在一次传递中验证您(似乎)想要的所有内容(请参阅 regex101):

^\w+({[A-Z0-1-_.*]+(\|[A-Z0-1-_.*]+)*}\w+)*$

这是几层可能重复的部分。

以下是细分:

^锚点匹配文字开头

\w+匹配任意数量的“字”字符

{[A-Z0-1-_.*]+(\|[A-Z0-1-_.*]+)*}匹配括号中的元素,可能后跟括号内的任意数量的管道和其他元素

({[A-Z0-1-_.*]+(\|[A-Z0-1-_.*]+)*}\w+)*这是之前描述的匹配,允许重复零次或多次,每次都使用另一个“单词”

$锚点匹配文字结尾