正则表达式:查找并将字符之间的snake_case替换为UpperCamelCase / PascalCase

时间:2019-06-30 16:23:39

标签: regex replace ide text-editor

我正在使用我的IDE的“查找和替换”(带有RegEx)功能来查找和替换参数的类型参数,以从snake_case到PascalCase(AKA UpperCamelCase)。在整个项目中,有几个文件和行需要更改,而手动执行此操作很容易出错且乏味(此外,我确信我将再次需要基本模式以进行将来的更改)。

例如:

CURRENT: function find_all_by_name_and_status(_i_find_all_by_name_and_statusCriteria find_all_by_name_and_status_criteria) ...

应该是:

DESIRED: function find_all_by_name_and_status(IFindAllByNameAndStatusCriteria find_all_by_name_and_status_criteria) ...

我正在使用的模式如下:

FIND: (?<=\()_(.)(Criteria)*

REPLACE: \U$1\L

据我所知,如果找到的第一个捕获组正确(“ _”后面的字母),替换模式将起作用。

_(.)的核心模式找到了要替换的正确组件,但是,它也捕获了字符串的其他部分。因此,我在(?<=\()后面添加了一个正向后缀,以{开头的括号开始,并为(Criteria)*结束了虚拟捕获。整个模式似乎导致核心模式仅匹配一次,而不是重复匹配。 (?R)似乎也无济于事。

P.S。

看起来(Criteria)*也没有任何作用,但是我认为这是在获得核心模式以查找所有匹配项/重复序列之后要解决的第二个问题。

我觉得我已经接近解决方案了,但是还不完全解决。当然,我可能会非常不满意该解决方案。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

此表达式

(.*\()|(_)([a-z])([a-z]*)|(Criteria.*)

实际上不是最好的,但替换了类似的内容:

$1\U$3\L$4\E$5

可能在这里可以工作(\E用于演示)。

如果您感兴趣的话,请在右侧面板的demo中对表达式进行说明。

RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 1 :(得分:1)

这可用于Notepad ++

  • Ctrl + H
  • 查找内容:(\(|\G)_(.[^\W_]*)(?=\w+Criteria)
  • 替换为:$1\u$2
  • 检查匹配大小写
  • 检查环绕
  • 检查正则表达式
  • 全部替换

说明:

(\(|\G)             # group 1, openning parenthesis or restart from last match position
_                   # underscore
(.[^\W_]*)          # group 2, 1 any character followed by 0 or more alphanum
(?=\w+Criteria)     # positive lookahead, make sure we have 1 or more word character and Criteria

替换:

$1          # content of group 1
\u$2        # content of group 2 with first character uppercased

给定示例的结果

function find_all_by_name_and_status(IFindAllByNameAndStatusCriteria find_all_by_name_and_status_criteria) ...

屏幕截图:

enter image description here