我需要一个正则表达式语句来查找任何采用 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
)正则表达式。