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

时间:2008-09-17 21:33:32

标签: regex

我正在尝试验证用户ID与示例匹配:

smith.jack or smith.jack.s

换句话说,任意数量的非空白字符(除了点),后跟一个点,后跟任意数量的非空白字符(点除外),可选地后跟一个点后跟任意数量的非空白字符(点除外)。我想出了几个可以正常工作的变化,除了允许连续点!例如,以下正则表达式

^([\S][^.]*[.]{1}[\S][^.]*|[\S][^.]*[.]{1}[\S][^.]*[.]{1}[\S][^.]*)$

匹配“smith.jack”和“smith.jack.s”,但也匹配“smith..jack”“smith..jack.s”!我的天哪,它甚至喜欢一个圆点作为第一个角色。似乎编码会如此简单,但事实并非如此。我正在使用.NET,顺便说一句。

令人沮丧。

12 个答案:

答案 0 :(得分:6)

有帮助吗?

/^[^\s\.]+(?:\.[^\s\.]+)*$/

或者,在扩展格式中,带有注释(ruby-style)

/
  ^           # 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 :(得分:2)

您正在使用*复制,它允许给定组件的0次迭代。

你应该使用加号,并将最终的。[^。] +放入一个组后跟?表示额外设定的可能性。

可能没有完美的语法,但类似下面的内容应该有效。

^ [^ \ S] + [。] [^ \ S] +([。] [^ \ S] +)?$

或者简单来说,任何非零数字的非空白非点字符,后跟一个点,后跟任意非零数量的非空白非点字符,后面跟一个点,后面跟着任何非零数量的非空白非点字符。

答案 2 :(得分:2)

^([^ \ S。] +)\([^ \ S。] +)。(?:[^ \ S] \(+))?$

答案 3 :(得分:2)

我不熟悉.NET的正则表达式。这将在Perl中做你想要的。

/^\w+\.\w+(?:\.\w+)?$/

如果.NET不支持非捕获(?:xxx)语法,请改为使用:

/^\w+\.\w+(\.\w+)?$/

注意:我假设当你说“非空白,非点”时,你的意思是“单词字符”。

答案 4 :(得分:2)

我意识到这已经解决了,但我发现Regexpal对正则表达式的原型设计非常有帮助。该网站有大量简单的基础解释,让您在调整表达式时看到匹配的内容。

答案 5 :(得分:1)

[^\s.]+\.[^\s.]+(\.[^\s.]+)?

BTW你要求的是什么“。”和“..”

答案 6 :(得分:0)

我认为你会受益于使用+表示“1或更多”,而不是*表示“任何数字包括零”。

答案 7 :(得分:0)

(^.)+|(([^.]+)[.]([^.]+))+

但是这会匹配x.y.z.a.b.c并且根据你的描述,我不确定这是否有足够的限制。

BTW:如果我犯了一个愚蠢的错误(我没有使用.NET,但已经完成了正则表达式),可以随意修改。

答案 8 :(得分:0)

[^.\s]+\.[^.\s]+(\.([^\s.]+?)? 

拥有无与伦比的力量。如果更正为

[^.\s]+\.[^.\s]+(\.([^\s.]+?))?

仍然太自由了。匹配a.b.以及a.b.c.d.和.a.b
如果更正为

[^.\s]+\.[^.\s]+(\.([^\s.]+?)?)

与a.b不匹配

答案 9 :(得分:0)

^([^.\W]+)\.?([^.\W]+)\.?([^.\W]+)$

这应按照描述进行捕获,对id的各个部分进行分组并停止重复句点

答案 10 :(得分:0)

我采取了略微不同的方法。我想你真的只想要一串非空格字符后跟一个点,但那个点是可选的(对于最后一个条目)。那你想重复一遍。

^([^\s\.]+\.?)+$

现在,这意味着你必须至少有一个字符串,例如'史密斯'匹配。当然,您可以将其限制为仅允许使用

进行一到三次重复
^([^\s\.]+\.?){1,3}$

我希望有所帮助。

答案 11 :(得分:0)

RegexBuddy是一个很好的(非免费)正则表达式工具