Eclipse 或 Notepad++ 中区分大小写的字符串替换
Posted
技术标签:
【中文标题】Eclipse 或 Notepad++ 中区分大小写的字符串替换【英文标题】:Case sensitive string replacement in Eclipse or Notepad++ 【发布时间】:2012-02-08 01:49:17 【问题描述】:我正在使用 Eclipse 和 Notepad ++ 来执行替换多个文件(xml 和 java)
我正在尝试将 [Pp]roduct[Mm]ember 替换为 [Ff]und[Mm]ember 一次替换并保留案例。
ProductMember -> FundMember
productMember -> fundMember
productmember -> fundmember
使用捕获组很容易将 M 的大小写保留给 Member,但我对 P 替换一无所知。
感谢您的帮助!
【问题讨论】:
我不确定是否可以使用正则表达式来做到这一点。为什么您需要在一次搜索和替换中完成这项工作? 搜索和替换必须在 10 个文件夹中执行。一次替换可以降低出错的风险,因为我需要 10 次搜索和替换而不是 20 次。 @leconcombreless 在这种情况下,我建议使用脚本。或者尽可能在 IDE 中重构。 【参考方案1】:在 Eclipse 中,您可以使用正则表达式保留大小写运算符:\C。要解决您的示例,您应该搜索“Product”,替换为“\CFund”(请务必勾选正则表达式选项)。这将替换 Product with Fund 和 product with fund。
更新:
确保不要选中区分大小写框。
【讨论】:
如果这行得通,那么肯定有一些情况下行不通。我刚刚在我想用 AnotherCamelCasedWord 替换的 CamelCasedWord 上尝试了它,尽管 \C 它总是执行直接替换而不切换它应该切换的大小写。 直到我意识到我选中了“区分大小写”框,取消选中后替换按预期工作,我才能让它工作。【参考方案2】:np++ 正则表达式很差,你可以使用 perl one-liner 来完成这项工作:
perl -pi.back -e's(productmember) uc fundmember | (uc $1 ^ $1) . (uc(substr $1, -1) ^ substr $1, -1) x (length($new) - length $1) egi;' theFile
摘自perl faq6
【讨论】:
【参考方案3】:虽然 Notepad++ 缺少 Eclipse 中可用的 \C
功能,但 Notepad++ 仍然可以解决一些区分大小写的替换用例,尽管它不如 \C
功能通用。 (从技术上讲,我相信 NPP 使用 \C
作为 .
的同义词)。
功能参考
请参考 Notepad++ 用户手册,其中有一个名为 Substition Escape Sequences 的部分描述了支持的 substitution 转义序列,例如:
\L
(将替换表达式中的以下字符变为小写,直到看到\E
)
\U
(将替换表达式中的以下字符变为大写,直到看到 \E
)。
在此之后,有一个名为 Substitition Conditionals 的部分描述了允许您仅在特定捕获组匹配时进行替换的功能。
示例
假设我有字符串foo FOO foo FOO
,我想执行区分大小写的替换s/foo/bar
,所以我的结果是bar BAR bar BAR
。有了上面提到的 Notepad++ 功能,我可以做这个替换。
匹配正则表达式
(foo)|(FOO)
替换正则表达式
(?1\L:\U)bar
如果匹配到foo
,上面的替换表达式将用\Lbar
(显然与文字bar
相同)替换匹配项,如果匹配FOO
,则替换为\Ubar
(等效于文字BAR
)。我省略了\E
,因为它不需要,因为表达式结束就可以了。
为了正确的结果,不要忘记打开区分大小写复选框!
【讨论】:
以上是关于Eclipse 或 Notepad++ 中区分大小写的字符串替换的主要内容,如果未能解决你的问题,请参考以下文章