正则表达式匹配name1.name2 [.name3]

时间:2020-03-05 19:00:08  来源:igfitidea点击:

我正在尝试验证用户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是用于正则表达式的好工具(非免费)