带条件重复的正则表达式

时间:2014-09-22 14:01:41

标签: c# .net regex

我有以下正则表达式:

^((_[a-zA-Z0-9]|[a-zA-Z])+((?<bracket>\[)[0-9]+(?<-bracket>\])(?(bracket)(?!)))?)$

如果有一个点(.

,我希望重复此操作

我知道我可以重复这样的表达式添加点(.

^((_[a-zA-Z0-9]|[a-zA-Z])+((?<bracket>\[)[0-9]+(?<-bracket>\])(?(bracket)(?!)))?)(\.((_[a-zA-Z0-9]|[a-zA-Z])+((?<bracket>\[)[0-9]+(?<-bracket>\])(?(bracket)(?!)))?))*$

但我想知道是否有更好的方法,而不复制初始部分。

背景:

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

允许:

  • Dog.Tail
  • Dogs[0].Tail.IsMoving

不允许:

  • Dog.
  • Dogs[0].

1 个答案:

答案 0 :(得分:2)

您可以使用递归。见:

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

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