regex - 什么 Perl 正则表达式可以匹配 CamelCase 单词?

标签 regex perl

我在 .todo 文件中搜索以下单词:

ZshTabCompletionBackward 
MacTerminalIterm

我做了以下正则表达式
[A-Z]{1}[a-z]*[A-Z]{1}[a-z]*

然而,这还不够,因为它只找到以下类型的词
ZshTab

在伪代码中,我正在尝试制作以下正则表达式
([A-Z]{1}[a-z]*[A-Z]{1}[a-z]*){1-9}

如何在 Perl 中制作上述正则表达式?

最佳答案

我想你想要这样的东西,用 /x 写的添加注释和无关紧要的空格的标志:

/
\b # 单词边界,因此您不会从单词中间开始

( # 打开分组
[A-Z] # 首字母大写
[a-z]* # 任意数量的小写字母
) # 结束分组

{2,} # 量词:至少 2 个实例,最大无界

\b # 词边界
/X

如果你想要它没有花哨的格式,只需删除空格和注释:

/\b([A-Z][a-z]*){2,}\b/

正如 j_random_hacker 指出的那样,这有点简单,因为它将匹配一个只是连续大写字母的单词。他的解决方案,我已经扩展了 /x要显示一些细节,请确保至少有一个小写字母:

/
\b # 从单词边界开始
[A-Z] # 从上开始
[a-zA-Z]* # 后跟任何字母

(?: # 交替优先级的非捕获分组
[a-z][a-zA-Z]*[A-Z] # 下一位是低位,任何零或更多,以高位结束
| # 或者
[A-Z][a-zA-Z]*[a-z] # 下一位是高位,任意零或多个,以低位结束
)

[a-zA-Z]* # 剩下的任何东西
\b # 以单词结束
/X

如果你想要它没有花哨的格式,只需删除空格和注释:

/\b[AZ][a-zA-Z]*(?:[az][a-zA-Z]*[AZ]|[AZ][a-zA-Z]*[az])[a- zA-Z]*\b/

我在 Learning Perl 中解释了所有这些功能.

关于regex - 什么 Perl 正则表达式可以匹配 CamelCase 单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/815787/

相关文章:

regex - Google Analytics IP 过滤器排除

c++ - C++ 的 std::regex 中有最大组限制吗?

perl - 使用数组寻址哈希的哈希

Javascript正则表达式匹配除双空格之外的所有内容,然后替换

c# - 如何使用正则表达式来匹配不在列表中的任何东西?

javascript - 需要正则表达式来匹配字符串开头的特殊字符

perl - Bioperl:初学者的笔记或在线引用

perl - 如果安装或未安装软件包,在 Ubuntu/Debian 中返回 0 或 1 的软件包管理器命令

perl - 使用 perl 下载 CPAN 模块

python - 从 Perl 调用 Node.js(或 python)