Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式检查所有元素之间是否有拆分符_C#_.net_Regex - Fatal编程技术网

C# 正则表达式检查所有元素之间是否有拆分符

C# 正则表达式检查所有元素之间是否有拆分符,c#,.net,regex,C#,.net,Regex,我有一个正则表达式,我试图用它来检测某个输入是否有效。输入的语法应该是{A | B | C}{A | B |}应该失败 (?: ( \{{1} (?:[A-Z0-1-_.*]+ \| [A-Z0-1-_.*]+)* \}{1} ) ) 这就是我目前所拥有的,但我开始认为这不是我要走的路。即使它工作正常,它也不允许应该有效的{A} 所以基本上我要做的是检查每个[A-Z0-1-.*]元素是否被|分割,并且{}括号内没有空元素 有一个概念让我觉得很有意义,那就是有n个可能的元素。比如

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

(?:
 (
  \{{1}
  (?:[A-Z0-1-_.*]+ \| [A-Z0-1-_.*]+)*
  \}{1}
 )
)
这就是我目前所拥有的,但我开始认为这不是我要走的路。即使它工作正常,它也不允许应该有效的
{A}

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

有一个概念让我觉得很有意义,那就是有n个可能的元素。比如说,要验证的字符串是
Foo{A}Bar{B|C}Test
我检查的方法有两个元素。一个元素用于检查字母字符,另一个元素用于检查括号中的字符。 因此,要检查上面的字符串,我需要执行
alphaElem*| BracketElem*| alphaElem*| BracketElem*| alphaElem*

但是这需要大量的书写,如果元素的数量增加,它就不能扩展。有什么方法可以用正则表达式解决这个问题吗?

此解决方案将在一次过程中验证您(似乎)想要的一切(请参见上的) ):

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

这是几层可能重复的部分

以下是分类:

^
锚定匹配文本开头

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

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

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

$
锚定匹配文本结尾

您可以使用

{[A-Z0-1-_.*]+(?:\|[A-Z0-1-_.*]+)*}
请注意,最后一个
*
修饰符可以替换为。例如,
{0,2}
匹配0、1或2次(匹配
{…}
中的1、2或3个元素)

详细信息

  • {
    -a
    {
    字符
  • [A-Z0-1-..*]+
    -字符类中定义的1个或多个字符(大写ASCII字母、
    0
    1
    -
    *
    字符)
  • (?:
    -匹配的0次或多次出现:
    • \\\\\\
      -a
      \
      字符
    • [A-Z0-1-..*]+
      -character类中定义的一个或多个字符
  • )*
    -分组构造结束
  • }
    -a
    }
    字符

注意:您不需要在.NET正则表达式中转义
{
}
字符,如果之前没有与
min
min,max
值匹配的
{
,则将
{
解析为文本
{
足够智能。

我对您的实际输入感到困惑。是
{a | B | C}
form或
Foo{A}Bar{B|C}Test
?您必须检查哪一个?可能您需要。最后一个
*
可以替换为
{0,2}
以匹配0、1或2次(匹配
{…}
中的1、2或3个元素)。@Fildor最终输入可能是字符串和{A}B}C}的任意组合Bracketso我的建议怎么样?是的,这就是我想要的