正则表达式:在字符之间查找并替换 snake_case 到 UpperCamelCase/PascalCase

RegEx: Find & Replace snake_case to UpperCamelCase/PascalCase Between Characters

我正在使用 IDE 的查找和替换(带 RegEx)功能来查找和替换参数的类型参数,以便从 snake_case 到 PascalCase(又名 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\L

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

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

P.S.

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

我觉得我已经接近解决方案,但还没有完全解决。当然,我可能会非常依赖解决方案。任何帮助将不胜感激。

这个表达式,

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

这不是最好的,用类似于以下内容的替换:

\U\L\E

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

在右侧面板的 demo 中,对表达式进行了解释,如果您可能感兴趣的话。

正则表达式电路

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

这正在使用 Notepad++

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

解释:

(\(|\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

替换:

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

给定示例的结果:

function find_all_by_name_and_status(IFindAllByNameAndStatusCriteria find_all_by_name_and_status_criteria) ...

屏幕截图: