0

我需要一个正则表达式模式来匹配以下结构的驼峰式 BEM 类:

BlockName_elementName-modifierName

我创建了这个正则表达式来完成这项工作:

([A-Z][a-z0-9]+)+(\_[a-z0-9]+[A-Z0-9]?[a-z0-9]*)?(\-[a-z0-9]+[A-Z0-9]?[a-z0-9]*)?

应匹配的字符串示例:

Block
BlockName
BlockNameLonger
BlockName93

BlockName_element
BlockName_elementName
BlockName_elementNameLonger
BlockName_4elementName

BlockName_elementName-modifier
BlockName_elementName-modifierName
BlockName_elementName-modifierNameLonger
BlockName_elementName-modifier567Name

目前它匹配除“更长”字符串之外的所有字符串。我无法弄清楚如何正确分组以匹配任何长度的骆驼案例组。任何人都可以帮忙吗?

在此处查看演示:http ://regexr.com/3h0sf

4

1 回答 1

4

原来的:([A-Z][a-z0-9]+)+(\_[a-z0-9]+[A-Z0-9]?[a-z0-9]*)?(\-[a-z0-9]+[A-Z0-9]?[a-z0-9]*)?

分成几组以了解每个组匹配的内容:

  • ([A-Z][a-z0-9]+)+至少 1 组 1 个大写字母和至少 1 个小写字母/数字

  • (\_[a-z0-9]+[A-Z0-9]?[a-z0-9]*)?可选地,下划线后跟一些小写/数字,然后可选一个大写,然后是任意数量的小写/数字

  • (\-[a-z0-9]+[A-Z0-9]?[a-z0-9]*)?与上面相同,除了以破折号开头。

我们需要将 2nd 和 3rd 更改为在一组小写之后的第 1 个,因此我们只需将其拼接到它们中:

  • (\_[a-z0-9]+([A-Z][a-z0-9]+)*)?(将 + 更改为 * 因为可能没有任何大写组)

  • (\-[a-z0-9]+([A-Z][a-z0-9]+)*)?

全部一起:

([A-Z][a-z0-9]+)+(\_[a-z0-9]+([A-Z][a-z0-9]+)*)?(\-[a-z0-9]+([A-Z][a-z0-9]+)*)?
于 2017-10-21T10:12:50.407 回答