在 Notepad++ (Np++) 中使用正则表达式查找 CamelCase / WikiWord 单词

在 Notepad++ (Np++) 中使用正则表达式查找 CamelCase / WikiWord 单词

我需要一个正则表达式语句来查找任何采用 CamelCase 格式的单词。示例包括:

  • 骆驼香烟盒。
  • Trunk_Note。
  • 医学博士 Zung。
  • _MyToDo-家务。
  • _MyToDo-假期_坎昆
  • iOS_GReader

关键点:

  • 第一个字符可以是 Windows 操作系统文件名中有效的任何字符。
  • 任何字符可以是 Windows 操作系统文件名中有效的任何字符,包括.
  • 该单词将由前面的(空格)、(、 或[以及后面的(空格)、)、 或分隔]

为什么?我使用一款名为 Trunk Notes 的 iOS 应用来记录我生活中各个方面的大量笔记(1000 多个主题,涵盖 10 多年的工作、家庭和个人内容)。Trunk Notes 使用 Markdown 进行内容格式化,但对我的 CamelCase 单词存在特定问题。当放置在链接标签或标题中时,例如 iOS_WriteRoom,Markdown 引擎会卡住并生成损坏的 HTML。_单词中的下划线 ( ) 也会使引擎感到困惑。最简单的解决方案是在有问题的单词前面加上/,例如 /iOS_WriteRoom。

我开始手动编辑,但意识到正则表达式应该对我有用。所以我的正则表达式解决方案将查找匹配的模式,/如果/尚未添加 a,则添加 a。

提前感谢您的任何建议。

答案1

这尤其困难,因为你似乎没有遵循 CamelCase 风格,即首字母始终大写,并且允许多个连续的大写字母。唯一能涵盖你所有示例的定义是

Words containing at least two non-consecutive capital letters separated by 
lower case letters.

这意味着它还将捕获foObaR并非真正的 CamelCase 且可能不是您所需要的模式。

无论如何,下面的正则表达式符合您的所有示例*:

 [\(\[ ]([_\-\.a-z]*[A-Z][_\-\.a-zA-Z]+[A-Z]+[_\-\.a-z]*)[\)\] ]
  ----- - -------- - ---  ----------- - --- - -------- -- -----
    |   |     |    |  |        |      |  |  |     |    ||   |> Right boundary: 
    |   |     |    |  |        |      |  |  |     |    ||         ),] or space
    |   |     |    |  |        |      |  |  |     |    ||----> Close capture
    |   |     |    |  |        |      |  |  |     |    |-----> 0 or more
    |   |     |    |  |        |      |  |  |     |----------> Character class:
    |   |     |    |  |        |      |  |  |                   ,-,., or a to z
    |   |     |    |  |        |      |  |  |----------------> 1 or more    
    |   |     |    |  |        |      |  |-------------------> A to Z       
    |   |     |    |  |        |      |----------------------> 1 or more 
    |   |     |    |  |        |-----------------------------> Character class:
    |   |     |    |  |                                        ,-,., a to z 
    |   |     |    |  |                                        or A to Z
    |   |     |    |  |--------------------------------------> Capital letter
    |   |     |    |-----------------------------------------> 0 or more
    |   |     |----------------------------------------------> Character class:
    |   |                                                      ,-,., and a to z
    |   |----------------------------------------------------> Open capture
    |--------------------------------------------------------> Left boundary:
                                                               (,[ or space

* 我认为。我自己没有用过 notepad++,但是他们的网站说他们使用Perl 兼容正则表达式。以上是符合您所有示例的 PCRE。

答案2

克雷格--

我认为上面的方法并不适用于 Notepad++ 中的所有情况。如果您尚未找到答案,请尝试以下变体:

([(\[\s])([a-z0-9_.\-]*[A-Z]+[a-z0-9_.\-]+[A-Z]+[a-z0-9_.\-]*)([)\]\s])

这还将匹配边界字符 -- []()或空格 ( \s) -- 以确保您只获取想要捕获的 WikiWords。在“查找”字段中使用该字符串,并在“替换”字段中使用此字符串:

\1/\2\3

...最后你应该用(例如)来(/MyWikiWords)代替(MyWikiWords)


如果您有一些 WikiWords 出现在括号或圆括号的上下文之外,您可以尝试此搜索:

\b([a-z0-9_.\-]*[A-Z]+[a-z0-9_.\-]+[A-Z]+[a-z0-9_.\-]*)\b

...替换部分如下:

/\1

...使用单词边界(\b)正则表达式。

相关内容