匹配所有非 kebab 大小写的嵌套 SCSS 选择器的正则表达式

Regex to match all nested SCSS selectors that are not kebab case

更新:我得出的结论是 RegExp 对于这个特定问题不是一个可行的选择。

感谢您的帮助。

问题

TLDR: I want to create a RegExp that can scan all nested SCSS selectors, and match everything that is not kebab-case (with the exception of pseudo selectors first-child, last-child, etc).

我正在寻找与 stylelint 中的 selected-nested-patterns 结合使用的正则表达式。

我想在我们的 SCSS 模块中禁止任何 kebab 大小写嵌套选择器。

不幸的是,我无法使负面前瞻工作。

要求:

class // YES
class-class // NO
class--class // NO
somethingSomething // YES
&Class // YES
&-class // NO
&--class // NO
&.class // YES
&__class // NO
input > input // YES
& > & // YES
~ class // YES
> div // YES
a,      c // YES
&.disabled:disabled:hover // YES
& > div:first-child // YES
&:last-child // YES

我不确定是否理解您要查找的内容,但似乎您唯一不需要的字符是连字符和下划线。所以我们实际上可以使用像 ^[^_-]+$ 这样简单的正则表达式来表示你想处理只包含“不是下划线或连字符”的字符串。

但我们也可以换一种方式,只列出您想要与 ^[&.a-zA-Z>:+~,\h]+$ 匹配的字符。

你可以在这里测试:https://regex101.com/r/LSiVju/1

  • ^ 声明行首的位置。

  • 匹配列表中的单个字符:[&.a-zA-Z>:+~,\h]

    -\h是横向的space。您可以将其替换为 \s 这也 包括新行。

    • a-zA-Z 是字母字符的范围。
  • + 是说我们要一次又一次的字符。

  • $ 声明字符串末尾的位置。

  • g修饰符:全局。所有比赛(第一场比赛后不return)

  • m修饰符:多行。使 ^ 和 $ 匹配每个的 begin/end 行而不是 begin/end 的字符串。这仅用于示例 你的案件清单。您不会使用 m 修饰符。

但我不认为它那么简单,因为我们也可以有数字(你的问题中没有提到)。

这些呢?

h1
&.class2
> one4you

如果你也想匹配数字那么它将变成^[&.a-zA-Z0-9>:+~,\h]+$

而且我们还知道 class .2lines 不是有效的 class,因为您不能以数字开头。因此,正则表达式可能会变得更加复杂,因为 .col-2.col-4 通常有效 Bootstrap CSS classes 其中数字不在开头。我们理想情况下不应该匹配 &.4you 但匹配 &.col3&.col-3 如果你在 CSS class 中接受连字符就像几乎所有的大 CSS 框架.