我正在尝试验证用户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,顺便说一句。
令人沮丧。
答案 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是一个很好的(非免费)正则表达式工具