我希望创建一个正则表达式,该表达式匹配以可选减号-开头并以减号结尾的字符串。两者之间必须以字母(大写或小写)开头,字母、数字的任何组合都可以跟着,最多可以包含一个asterix (*)。
到目前为止我已经想出了这个
[-]?[a-zA-Z]+[a-zA-Z0-9(*{0,1})]*[-]一些我想要达到的目标的例子。
"-yyy-" // valid
"-u8r*y75-" // valid
"-u8r**y75-" // invalid发布于 2017-11-30 19:39:53
代码
^-?[a-z](?!(?:.*\*){2})[a-z\d*]*-$或者,您可以使用下面的regex实现相同的结果,而不必使用负前瞻性。
^-?[a-z][a-z\d]*(?:\*[a-z\d]*)?-$结果
输入
** VALID **
-yyy-
-u8r*y75-
** INVALID **
-u8r**y75-输出
-yyy-
-u8r*y75-解释
^在行开始处的断言位置-?匹配零或连字符-之一[a-z]在a和z之间匹配一个alpha字符。请注意,i修饰符是打开的,因此这也将匹配相同字母的大写变体。(?!(?:.*\*){2})负前瞻性确保以下内容与不匹配(?:.*\*){2}匹配星号*两次
[a-z\d*]*匹配a和z之间的任意ASCII字母,或数字,或星号符号*,任意次数。-与这个字符匹配$断言在行尾的位置发布于 2017-11-30 19:35:21
发布于 2017-11-30 19:49:32
(-)?(\w)+(\*(?!\*)|\w+)(-)我用分组来更清楚地说明这一点。我把[a-zA-Z0-9]改成了\w,它代表着同样的意思。(\*(?!\*)|\w+)
这是一个重要的变化。用文字解释:如果它是一个星\*,而前面的字符不是星(?!\*)(称为负展望=查看前面的部分),或者如果它是\w = [a-zA-Z0-9]。
使用此站点测试:https://regexr.com/
他们有一个很好的解释左菜单下的“参考”。
https://stackoverflow.com/questions/47581197
复制相似问题