我想创建一个正则表达式,该表达式匹配以可选减号-
开头并以减号结尾的字符串。中间必须以字母(大写或小写)开头,后面可以跟字母,数字的任意组合,最多可以包含一个星号(*)
到目前为止,我已经提出了这个
[-]?[a-zA-Z]+[a-zA-Z0-9(*{0,1})]*[-]
我想要实现的一些例子。
"-yyy-" // valid
"-u8r*y75-" // valid
"-u8r**y75-" // invalid
答案 0 :(得分:4)
^-?[a-z](?!(?:.*\*){2})[a-z\d*]*-$
或者,您可以使用以下正则表达式来实现相同的结果,而不使用否定前瞻。
^-?[a-z][a-z\d]*(?:\*[a-z\d]*)?-$
** VALID **
-yyy-
-u8r*y75-
** INVALID **
-u8r**y75-
-yyy-
-u8r*y75-
^
在行首处断言位置-?
匹配零个或一个连字符-
[a-z]
在a
和z
之间匹配单个ASCII字母字符。请注意,i
修饰符已启用,因此也会匹配相同字母的大写变体(?!(?:.*\*){2})
否定前瞻确保后续内容不匹配
(?:.*\*){2}
匹配星号*
两次[a-z\d*]*
匹配a
和z
之间的任何ASCII字母,或数字,或字母符号*
,任意次数-
字面上匹配此字符$
断言行尾的位置答案 1 :(得分:0)
答案 2 :(得分:0)
(-)?(\w)+(\*(?!\*)|\w+)(-)
我使用分组来使其更清晰。我将[a-zA-Z0-9]
更改为\w
,代表相同。
(\*(?!\*)|\w+)
这是一个重要的变化。用文字解释:
如果它是星号\*
且前面的字符不是星号(?!\*)
(称为负前瞻=查看前一部分),或者它是\w
= [a-zA-Z0-9]
。
使用此网站测试:https://regexr.com/
他们在"参考"。
下的左侧菜单上有很好的解释