我有以下正则表达式:
^((_[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].
答案 0 :(得分:2)
您可以使用递归。见:
^((_[a-zA-Z0-9]|[a-zA-Z])+((?<bracket>\[)[0-9]+(?<-bracket>\])(?(bracket)(?!)))?)(\.\1)*$
^^
\1
递归第一个捕获组( )
中的第一个子模式。但是,这比您尝试的正则表达式效率低两步,这对于这种情况是最佳的。这里可以使用递归来提高其可读性,但不是推荐的做法。