寻求帮助以构建正则表达式以进行模式匹配

时间:2021-06-10 15:15:12

标签: regex

如果有人可以提供帮助,我正在寻求帮助来制作正则表达式以匹配而不是匹配一系列名称模式。

这是我想匹配/不匹配的案例列表:

// Should Match :
_class
c-class
_class-like
_class--variation
_class__children
_class__children--variation
c-custon-button-test
_class__lol--test
c-my-button-super-style
_class--variation-like

// Should not Match :
class
c--class
_class---variation
_class----variation
_class__test__test
_class--variation__children
_like
c-like
noMargin
no-Margin
_no-Margin
no-margin
_class-like__children
_class-like--variation

现在我想出了这个正则表达式:

^(c-|_)([a-z]+)(__|--|-)?([a-z]+)(-{0,2}[a-z]+)+(-?(([a-z]-?)+|(like))$)

这几乎可以工作,但我仍然匹配了一些不应该匹配的案例,恐怕我正在努力寻找如何对最后一个案例进行排序。

(这是带有单元测试和匹配案例的 regex101 的链接:https://regex101.com/r/HNAUpd/1/

编辑:我忘了提到,关于“like”这个词,它是我的模式中的一个关键字,只能出现在字符串的末尾,不能是字符串中的唯一词。

编辑2:至于匹配规则如下:

  • 字符串只能以“_”、“c-”或“js-”开头。
  • 后面的单词可以是“like”以外的任何单词,并且不能是 [a-z] 范围内的任何其他字母,并且只能是小写。
  • 单词“like”只能是字符串的最后一个,不能是字符串中的唯一一个。
  • 单词可以用“--”或“__”分隔。
  • 如果字符串以“c-”开头,那么除了前面的分隔符之外,还可以用“-”分隔单词。

所有这一切的目的是为 linter 提供一个 CSS 类/id 匹配器。

如果有人可以帮助我,那就太棒了:)

1 个答案:

答案 0 :(得分:2)

我认为您正在寻找这样的东西:

^(?!.*[\-_]like[\-_])(?:c-|js-|_)(?!like$)(?:[a-z]+(?:__|--?))?[a-z]+(?:--?[a-z]+)*$

Demo

细分:

  • ^ - 字符串的开头。
  • (?!.*[\-_]like[\-_]) - 在两个分隔符之间不包含单词“like”(仅在字符串的末尾)。
  • (?:c-|js-|_) - 字符串开头的“c-”、“js-”或“_”。
  • (?!like$) - 后面没有紧跟“喜欢”这个词。
  • (?:[a-z]+(?:__|--?))? -(可选)一个或多个 a-z 字母后跟两个下划线或一两个连字符。
  • [a-z]+ - 一个或多个 a-z 字母。
  • (?:--?[a-z]+)* - 匹配一个或两个连字符后跟一个或多个 a-z 字母,并重复零次或多次。
  • $ - 字符串结束。
相关问题