正则表达式:在字符之间查找并替换 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) ...
屏幕截图:
我正在使用 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) ...
屏幕截图: