检查给定输入是由以下分隔:仅3次

时间:2016-08-11 13:26:35

标签: regex

如何验证输入字符串是xxx:xxx:xxx格式。我不需要验证由:分隔的字符数。我只需要确保给定输入中有:分隔的3个块。

输入可以包含任何字符,包括空格,但不包含仅由以下内容分隔的3个空格:

这就是我的正则表达式的样子:

\w{3}:\w{3}:\w{4}$

此正则表达式的问题在于它检查格式xxx-xxx-xxxx并使其他所有内容无效。我需要删除该约束。

有效输入可以是:

some:word that:is given by the user
a valid input:also:looks like this
and it:can:be this

输入无效:

 : : 
this:is invalid
this:is:also:invalid
this is invalid

如果您能解释正则表达式,我将非常感谢

2 个答案:

答案 0 :(得分:4)

你可以使用像

这样的正则表达式
^(?![\s:]*$)[^:]+:[^:]+:[^:]+$

或VERBOSE版本:

    ^   (?![\s:]*$)    [^:]+   :    [^:]+   :   [^:]+     $
  start  no empty      1st          2nd         3rd     end  

这是WORKING regex demo

^匹配字符串的开头,[^:]+匹配除::以外的1个或多个字符匹配冒号。 $匹配字符串的结尾。

(?![\s:]*$)前瞻将阻止块全部为空的匹配。

<强>更新

如果 任何 的块为空,要使匹配失败,请在每个块之前添加前瞻限制:

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

请参阅another regex demo

答案 1 :(得分:1)

另一种可能的解决方案,基于@WiktorStribiżew的回答。如果需要可变数量的组,则此更改将使其更好,因为我们只需将{2}更改为所需的组数-1。

^(?![\s:]*$)([^:\n]+:){2}[^:\n]+$

更新1

解决以下问题:

  

这个正则表达式不能确定是否所有部分都是空的

经过一些调整,我得到了以下更新,仍然可以使用不同数量的组:

^(((\s*[^:\s]+)|(\s+[^:\s]+)|([^:\s]+\s+)|([^:\s]+\s*))+(\s)*:){2}(?!\s*$)[^:]+$