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++ 中区分大小写的字符串替换的主要内容,如果未能解决你的问题,请参考以下文章

Spark 中区分大小写的连接

是否有一个 Eclipse 插件可以让您在多个 Subversion 修订中区分单个 Java 方法?

MS Access 中区分大小写的搜索

.emacs 中区分大小写的 setq 无效

java中区分大小写吗???

Visual C++ 中区分大小写的短语搜索