【问题标题】:Regex find CamelCase strings and dashes, replace with lowercase_underscored正则表达式查找 CamelCase 字符串和破折号,替换为 lowercase_underscored
【发布时间】:2013-02-07 17:03:41
【问题描述】:

在 PHPStorm 中,我需要查找/替换一些用于 CSS 类名和 DOM id 的混合大小写字符串。我无法更改 onClick 之类的属性,并且需要保留图像名称。这是我所拥有的:

<div class="ThumbContainer" id="Source-Data4-Thumb">
<div class="ThumbTitleArea">
    <div class="DataTitleDiv"> GYR Performance <img src="images/someImage.png" onClick="someFunc()" /></div>
</div>
    <div class="dataDetailArea">
    <div class="DataThumbArea"> Data Source:Client<br>
                    Last refreshed:12/05/2013 <br>
                    Records:206<br>
        <br>
                        Used for the following reports<br>
                -    GYR Performance<br>
        </div>
</div>
</div>

这是我需要的:

<div class="thumb_container" id="source_data4_thumb">
<div class="thumb_title_area">
    <div class="data_title_div"> GYR Performance <img src="images/someImage.png" onClick="someFunc()" /></div>
</div>
    <div class="data_detail_area">
    <div class="data_thumb_area"> Data Source:Client<br>
                      Last refreshed:12/05/2013 <br>
                      Records:206<br>
        <br>
                          Used for the following reports<br>
                 -    GYR Performance<br>
        </div>
</div>
</div>

注意dataDetailArea 以小写字母开头.. bleh。这将是一次查找/替换,因此不需要在 PHPStorm 中。它甚至可以在任何在线工具中,例如http://gskinner.com/RegExr/

我需要查找/替换的实际主干模板大约有 3100 行代码,否则我会在这里为您提供。

这是我目前所拥有的。好像和Camel-Case3-Foo不匹配:

(class|id|data-[?!=])="\b([A-Za-z][a-z-]*){2,}\b"

【问题讨论】:

  • 您使用的是哪个正则表达式? bash、java、c#、vi、emacs、VS2010?有一些区别。
  • 抱歉标签不正确。这些似乎是我上一个问题的延续,我没有注意到! :(
  • 这是 PHPStorm 查找/替换。我不确定 JetBrains 使用哪个版本。这有帮助吗? jetbrains.com/phpstorm/webhelp/…
  • 在执行正则表达式之前,您应该使用 HTML 解析器来分离出类和 id,否则您最终可能会更改标签中的内容。

标签: regex phpstorm


【解决方案1】:

这个正则表达式应该找到应该放置下划线的位置:

((?<=\w)(?=[A-Z])|-)

用 this 替换来插入下划线,然后将字符串转换为小写似乎是有意义的。

【讨论】:

  • 这对我不起作用。它似乎只匹配破折号。
  • 抱歉,编辑了我的答案。这应该匹配破折号以及字符和大写字符之间的空格。
  • 啊,我明白了,它并没有像我在其他尝试中那样突出显示匹配项。谢谢!
【解决方案2】:

我会搜索这样的东西:

"[a-z0-9_]*\([A-Z]\)

引号后面带有小写、数字或下划线字符。 后面的任何东西都有一个大写字母。 制作大写字母子表达式1。

将子表达式 1 替换为下划线 + tolower() 函数的结果。

您需要对每一行应用多次,因为它只会找到一个 每遍大写字母。

【讨论】:

  • 不确定是否要匹配下划线(Date_Range 变为 date__range?)
  • 如果你有这个可能会失败:
  • 如果有多个大写字母,则需要下划线。如果它将“myStuffHere”的第一个实例替换为“my_stuffHere”,那么如果没有它,以后的传递将失败
  • 或许"[^"]*[a-z0-9]\([A-Z]\) 会更合适?
  • 谢谢杰!请查看我更新的问题 - 希望它更加简洁和干燥。我认为我最初的问题可能含糊不清,我深表歉意。
猜你喜欢
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
相关资源
最近更新 更多