我有一个正则表达式,我试图用来检测某个输入是否有效。输入的语法应为{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*
但是这很多都是写出来的,如果元素的数量增加,它就无法扩展。有什么办法可以用正则表达式解决这个问题吗?
答案 0 :(得分:1)
您可以使用
{[A-Z0-1-_.*]+(?:\|[A-Z0-1-_.*]+)*}
请注意,最后一个*
修饰符可以替换为limiting quantifier。例如。 {0,2}
匹配0,1或2次(匹配{...}
内的1,2或3个元素)。
请参阅regex demo。
<强>详情
{
- {
字符[A-Z0-1-_.*]+
- 在字符类中定义的一个或多个字符(大写ASCII字母,0
,1
,-
,_
,{{1 }或.
字符)*
- non-capturing group匹配0次或多次:
(?:
- \|
字符|
- 在字符类[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+)*
这是之前描述的匹配,允许重复零次或多次,每次都使用另一个“单词”
$
锚点匹配文字结尾