如何在字符类中制作最多可以包含一个星号的正则表达式?

时间:2017-11-30 19:28:46

标签: regex

我想创建一个正则表达式,该表达式匹配以可选减号-开头并以减号结尾的字符串。中间必须以字母(大写或小写)开头,后面可以跟字母,数字的任意组合,最多可以包含一个星号(*)

到目前为止,我已经提出了这个

[-]?[a-zA-Z]+[a-zA-Z0-9(*{0,1})]*[-]

我想要实现的一些例子。

"-yyy-" // valid
"-u8r*y75-" // valid
"-u8r**y75-" // invalid

3 个答案:

答案 0 :(得分:4)

代码

See regex in use here

^-?[a-z](?!(?:.*\*){2})[a-z\d*]*-$

或者,您可以使用以下正则表达式来实现相同的结果,而不使用否定前瞻。

See regex in use here

^-?[a-z][a-z\d]*(?:\*[a-z\d]*)?-$

结果

输入

** VALID **
-yyy-
-u8r*y75-

** INVALID **
-u8r**y75-

输出

-yyy-
-u8r*y75-

说明

  • ^在行首处断言位置
  • -?匹配零个或一个连字符-
  • [a-z]az之间匹配单个ASCII字母字符。请注意,i修饰符已启用,因此也会匹配相同字母的大写变体
  • (?!(?:.*\*){2})否定前瞻确保后续内容不匹配
    • (?:.*\*){2}匹配星号*两次
  • [a-z\d*]*匹配az之间的任何ASCII字母,或数字,或字母符号*,任意次数
  • -字面上匹配此字符
  • $断言行尾的位置

答案 1 :(得分:0)

试试这个:

-(((\w|\d)*)(\*?)((\w|\d)*))-

你可以在这里试试: https://regex101.com/

答案 2 :(得分:0)

(-)?(\w)+(\*(?!\*)|\w+)(-)

我使用分组来使其更清晰。我将[a-zA-Z0-9]更改为\w,代表相同。 (\*(?!\*)|\w+)

这是一个重要的变化。用文字解释: 如果它是星号\*且前面的字符不是星号(?!\*)(称为负前瞻=查看前一部分),或者它是\w = [a-zA-Z0-9]

使用此网站测试:https://regexr.com/

他们在"参考"。

下的左侧菜单上有很好的解释