正则表达式匹配name1.name2 [.name3]
我正在尝试验证用户ID是否与示例匹配:
smith.Hyman or smith.Hyman.s
换句话说,任意数量的非空白字符(点除外),紧随其后的是一个点,然后是任意数量的非空白字符(点除外),然后可选地是紧随其后的是一个点,然后是任意数量的非空白字符(点除外)。除了允许连续的点,我提出了几种可以正常工作的变体!例如,以下正则表达式
^([\S][^.]*[.]{1}[\S][^.]*|[\S][^.]*[.]{1}[\S][^.]*[.]{1}[\S][^.]*)$
匹配" smith.Hyman"和" smith.Hyman.s",但也匹配" smith..Hyman"" smith..Hyman.s"!我的天哪,它甚至喜欢一个点作为第一个字符。似乎编码起来是如此简单,但事实并非如此。我正在使用.NET,顺便说一句。
令人沮丧
解决方案
回答
[^\s.]+\.[^\s.]+(\.[^\s.]+)?
顺便说一句,我们要求的内容允许"。"和 ".."
回答
有帮助吗?
/^[^\s\.]+(?:\.[^\s\.]+)*$/
或者,以扩展格式带有注释(红宝石风格)
/ ^ # start of line [^\s\.]+ # one or more non-space non-dot (?: # non-capturing group \. # dot something [^\s\.]+ # one or more non-space non-dot )* # zero or more times $ # end of line /x
我们尚不清楚点状内容有多少次,但是我们可以用{{1,3}`或者类似内容替换*以指定允许重复的次数。
我可能应该明确指出,斜杠是Ruby中字面的正则表达式定界符(以及perl和js等)。
回答
我认为,使用+表示" 1或者更多",而不是*表示"包括零的任何数字",我们会从中受益。
回答
我们正在使用*复制,它允许给定组件进行0次迭代。
我们应该使用加号,然后将最后一个。[^。] +放在一个组中,然后是?。表示有额外的设置的可能性。
可能没有完美的语法,但是应该类似于以下内容。
^ [^。\ s] + [。] [^。\ s] +([.. [^。\ s] +)?$
或者简单地说,是任何非零数量的非空白非点字符,后跟一个点,然后是任意非零数量的非空白非点字符,然后可选地是一个点,再跟一个非-零个非空白非点字符。
回答
(^.)+|(([^.]+)[.]([^.]+))+
但这将与x.y.z.a.b.c匹配,并且根据描述,我不确定这是否足够严格。
顺便说一句:如果我犯了一个愚蠢的错误,请随时进行修改(我没有使用过.NET,但是做了很多正则表达式)
回答
[^.\s]+\.[^.\s]+(\.([^\s.]+?)?
有无与伦比的paren。如果更正为
[^.\s]+\.[^.\s]+(\.([^\s.]+?))?
还是太宽松了。符合a.b.以及a.b.c.d.和.a.b
如果更正为
[^.\s]+\.[^.\s]+(\.([^\s.]+?)?)
与a.b不匹配
回答
^([^.\W]+)\.?([^.\W]+)\.?([^.\W]+)$
这应按说明进行捕获,对ID的各个部分进行分组并停止重复的句点
回答
^([^。\ s] +)\。([^。\ s] +)(?:\。([^。\ s] +))?$
回答
我对.NET的正则表达式不熟悉。这将在Perl中完成我们想要的操作。
/^\w+\.\w+(?:\.\w+)?$/
如果.NET不支持非捕获(?:xxx)
语法,请改用此格式:
/^\w+\.\w+(\.\w+)?$/
注意:我假设当我们说"非空格,非点"时,我们实际上是在说"单词字符"。
回答
我采取了略有不同的方法。我认为我们确实只想要一串非空格字符,后接一个点,但是该点是可选的(对于最后一个条目)。然后,我们想重复一次。
^([^\s\.]+\.?)+$
现在,这意味着我们必须至少包含一个字符串,例如"史密斯"来匹配。我们当然可以将其限制为只允许重复1-3次
^([^\s\.]+\.?){1,3}$
希望对我们有所帮助。
回答
我意识到这已经解决了,但是我发现Regexpal对于正则表达式的原型非常有用。该站点上有许多简单的基本说明,并允许我们在调整表达式时查看匹配的内容。
回答
RegexBuddy是用于正则表达式的好工具(非免费)