我正在使用我的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)*
也没有任何作用,但是我认为这是在获得核心模式以查找所有匹配项/重复序列之后要解决的第二个问题。
我觉得我已经接近解决方案了,但是还不完全解决。当然,我可能会非常不满意该解决方案。任何帮助将不胜感激。
答案 0 :(得分:1)
此表达式
(.*\()|(_)([a-z])([a-z]*)|(Criteria.*)
实际上不是最好的,但替换了类似的内容:
$1\U$3\L$4\E$5
可能在这里可以工作(\E
用于演示)。
如果您感兴趣的话,请在右侧面板的demo中对表达式进行说明。
jex.im可视化正则表达式:
答案 1 :(得分:1)
这可用于Notepad ++
(\(|\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) ...
屏幕截图: