C# 带条件重复的正则表达式

C# 带条件重复的正则表达式,c#,.net,regex,C#,.net,Regex,我有以下正则表达式: ^((_[a-zA-Z0-9]|[a-zA-Z])+((?<bracket>\[)[0-9]+(?<-bracket>\])(?(bracket)(?!)))?)$ 但我想知道是否有更好的方法,不必复制初始部分 背景: 我需要访问一台使用基于标签寻址的机器Micrologix 5000。在C#应用程序中,我想验证用户输入的地址是否正确 允许的: Dog.Tail Dogs[0]。Tail.IsMoving 不允许: 狗。 狗[0]。 您可以使

我有以下正则表达式:

^((_[a-zA-Z0-9]|[a-zA-Z])+((?<bracket>\[)[0-9]+(?<-bracket>\])(?(bracket)(?!)))?)$
但我想知道是否有更好的方法,不必复制初始部分

背景:

我需要访问一台使用基于标签寻址的机器Micrologix 5000。在C#应用程序中,我想验证用户输入的地址是否正确

允许的:

  • Dog.Tail
  • Dogs[0]。Tail.IsMoving
不允许:

  • 狗。
  • 狗[0]。

    • 您可以使用递归。见此:

      ^((_[a-zA-Z0-9]|[a-zA-Z])+((?<bracket>\[)[0-9]+(?<-bracket>\])(?(bracket)(?!)))?)(\.\1)*$
                                                                                          ^^
      
      ([a-zA-Z0-9]|[a-zA-Z])+((?\[)[0-9]+(?\])(?(括号)(?!))(\.\1)*$ ^^
      • \1
        递归第一个捕获组中的第一个子模式
        ()

      然而,这比您尝试的正则表达式效率低两步,对于这种情况,正则表达式是最佳的。这里可以使用递归来提高其可读性,但这不是推荐的做法。

      为什么使用\.\1反向引用组递归是解决方案,但我必须在我的案例中使用\1而不是?1它适用于基本测试案例,但不使用实际案例\1用于重复相同的捕获,但我需要重复相同的模式,因此解决方案是(?R),这在.Net中不受支持。
      ^((_[a-zA-Z0-9]|[a-zA-Z])+((?<bracket>\[)[0-9]+(?<-bracket>\])(?(bracket)(?!)))?)(\.\1)*$
                                                                                          ^^