我正在尝试构造具有以下要求的正则表达式
a-z
开头[\w:-]
中的任何字符。_
,但前提是该模式中的下划线之前有:
。一些有效模式的例子
hello123
你好:123
你好你好
hello:123-hello_345#有效的模式,因为在:
之前的模式中有一个_
hello-1:hell_world_123
无效的模式
hello_123
hello-123_world
hello_123:world
我尝试使用先行方式,但由于某种原因它不起作用,以下是我想出的模式
^[a-z]+[a-z0-9:-]*(?<=:)[_]*\w*
-该模式的问题在于,如果字符串中的任何地方都没有:
,它将停止匹配整个模式,因此它使:
成为必需的模式
我只想检查:
之前的字符串中是否有_
的地方,:
的存在。
答案 0 :(得分:1)
您可以使用
^(?![^_:]*_)[a-z][\w:-]*$
如果存在(?![^_:]*_)
和_
之前的_
,则:
否定超前将使匹配失败。
详细信息
^
-字符串的开头(?![^_:]*_)
-如果除_
和:
之外还有0个以上的字符,则负向查找将导致匹配失败,紧随其后的是当前位置右侧的_
[a-z]
-小写的ASCII字母[\w:-]*
-0个以上的单词,:
或-
个字符$
-字符串的结尾。答案 1 :(得分:0)
可以使用“或”运算符来解决:
^[a-z]+[a-z0-9-]*(:[a-z0-9-_]*|[a-z0-9-]*)$
成为亲吻的好处。
答案 2 :(得分:0)
^[a-z]+[a-z0-9-]*((:.+)|(:[a-z0-9-_]*)|[a-z0-9-]*)$
因此,可以通过在OR子句中添加模式组来解决。
这确实适用于您给出的示例。
您可以添加是否有任何未被捕获的组。
希望有帮助!