【问题标题】:regex match css class name from single string containing multiple classes正则表达式从包含多个类的单个字符串匹配 css 类名
【发布时间】:2012-09-12 15:36:09
【问题描述】:

我有一个包含多个 css 类的长字符串。使用正则表达式,我想匹配每个类名,因为我需要像这样替换这些类名:

<span>CLASSNAME</span>

我已经尝试了几个小时来想出一个解决方案,我认为我已经很接近了,但是对于某些类名,我无法从匹配中排除右大括号。

这是我一直在进行测试的示例字符串:

#main .items-Outer p{ font-family:Verdana; color: #000000; font-size: 50px; font-weight: bold; }#footer .footer-inner p.intro{ font-family:Arial; color: #444444; font-size: 30; font-weight: normal; }.genericTxt{ font-family:Courier; color: #444444; font-size: 30; font-weight: normal; }

这是我目前想出的正则表达式:

((^(?:.+?)(?:[^{]*))|((?:\})(?:.+?)(?:[^{]*)))

请查看我附上的屏幕截图,因为它会更清楚地显示我得到的匹配项。我的问题是我显然想从任何匹配中排除大括号。

为了澄清,我所追求的匹配示例是:

  • main .items-外页

  • 页脚.footer-inner p.intro

  • .genericTxt

【问题讨论】:

    标签: javascript css regex


    【解决方案1】:

    当且仅当没有任何嵌套的花括号,以下应该有效:

    /\.(-?[_a-zA-Z]+[_a-zA-Z0-9-]*)(?![^\{]*\})/
    

    这里是a demo

    请注意,我引用 this question 作为有效 CSS 类名正则表达式。

    编辑

    我刚刚阅读了您的评论,说明您希望匹配整个选择器,而不仅仅是类名。在这种情况下,试试这个,虽然我对它的稳健性没有那么自信:

    /[^}]*(?=\{|$)/
    

    这里是a demo of that one

    【讨论】:

    • 更新了此解决方案以回应对 Anirudha 解决方案的评论。
    • 是的,效果很好。我正试图找到解决方案。谢谢。
    【解决方案2】:

    这是它的正则表达式

    (?:(\}|^)).*?(?:\{)
    

    【讨论】:

    • 感谢您的帮助,很抱歉我可能没有很好地解释我需要什么。我需要整个班级名称。例如,使用我在 aove 上发布的字符串,我需要这些匹配项:#main .items-Outer p 和 #footer .footer-inner p.intro 和 .genericTxt
    • @effectica 希望这对现在有所帮助
    • 谢谢你,但我仍然在比赛中得到花括号。我的回答有问题吗?我在这里测试过regexpal.com
    • @effectica 它不会包含在结果中..使用正则表达式的 value 属性访问它
    【解决方案3】:

    假设 str 包含您的 CSS,以下正则表达式:

    str.match(/(?:#\w+\s+)?\.[\w-]+(?:\s+\w+\s*\.\w+|\s+\w+)?/ig)
    

    返回:

    ["#main .items-Outer p", "#footer .footer-inner p.intro", ".genericTxt"]
    

    正则表达式是:

    (?:#\w+\s+)?      -- optional leading CSS id, i.e. #abc
    \.[\w-]+          -- CSS classname, i.e. .ab-c
    (?:
        \s+\w+\s*\.\w+  -- optional CSS elt followed by classname, i.e. p.abc
    |                   -- or
        \s+\w+          -- optional CSS elt, i.e. p
    )?
    

    demo

    【讨论】:

    • 我想指出,无论大括号是否存在、不存在或嵌套如何,我的解决方案都有效。
    • 错误,这也将匹配不是类名的东西,在大括号内,例如行高:1.18;在大括号内导致 .18 匹配。
    猜你喜欢
    • 2022-08-04
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多