匹配所有非 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 大小写嵌套选择器。
不幸的是,我无法使负面前瞻工作。
要求:
- 一切
(&:>+~*\w)+
- 后面没有一个或多个连字符
(?!-)+
- 后面没有一个或多个下划线
(?!_)+
- 后接0个或多个白色space或字符
(?:([\w\s])*)
- 在 kebab 案例中接受 CSS 伪选择器 (
first-child
, last-child
)
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-z
和 A-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 框架.
更新:我得出的结论是 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 大小写嵌套选择器。
不幸的是,我无法使负面前瞻工作。
要求:
- 一切
(&:>+~*\w)+
- 后面没有一个或多个连字符
(?!-)+
- 后面没有一个或多个下划线
(?!_)+
- 后接0个或多个白色space或字符
(?:([\w\s])*)
- 在 kebab 案例中接受 CSS 伪选择器 (
first-child
,last-child
)
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-z
和A-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 框架.