如何从正则表达式获得多个第一场比赛?



我使用正则表达式从CSS文件中提取所有类名。如果只有一个类,例如.test {margin: 0},正则表达式工作得很好,但如果有一组类,例如.test.second.third {margin:0},我只需要第一个类的结果:.test

我当前的正则表达式给我.test, .second, .third。这很好,但这不是我需要的。正则表达式中的错误在哪里?

我在JavaScript中使用它:

code = code.match(/(?:[.]{1})([a-zA-Z_]+[w-_]*)(?:[s.,{>#:]{0})/igm);

或在这里作为regex101表:https://regex101.com/r/sgjrHt/1

在你的模式中:

  • (?:[.]{1})部分与.
  • 相同
  • 使用w也匹配_,所以你不必把它们都添加到这样的字符类[w-_]
  • 请注意,在该格式中,您必须转义连字符或将其放在字符类
  • 的开头或结尾。

如果支持向后看断言:

(?<!S).w+(?:[:-]+w+)*(?=[^{}]*{[^{}]*})

  • (?<!S)在左侧断言一个空白边界
  • .w+匹配.和1+字字符
  • (?:[:-]+w+)*可选重复匹配:-和1+字字符
  • (?=正向前看,向右断言
    • [^{}]*匹配{}以外的可选字符
    • {[^{}]*}匹配{...}
  • )关闭forward

Regex演示

如果没有后台,可以使用捕获组:

(?:s|^)(.w+(?:[:-]+w+)*)[^{}]*{[^{}]*}

Regex演示

最新更新