我正在寻找一个Perl正则表达式,它将使任何以空格开头的字符(或字符串中的第一个字符串)大写.
我很确定有一种简单的方法可以做到这一点,但我没有方便的Perl书,我不经常这样做,我记住它...
s/(\s\w)/\U$1\E/g;
我最初建议:
s/\s\w/\U$&\E/g;
但是在使用" $& "时(甚至在我阅读@Manni的评论之前),警报就响起了.事实证明,他们完全合理 - 使用$&,$`和$'操作会导致正则表达式整体效率低下.
\ E对于这个正则表达式并不重要; \U
在这种情况下它会关闭'case-setting'开关或\L
小写.
如注释中所述,匹配字符串的第一个字符需要:
s/((?:^|\s)\w)/\U$1\E/g;
修正了第二个右括号的位置 - 谢谢,Blixtor.
根据您的确切问题,这可能比您想象的更复杂,简单的正则表达式可能无法正常工作.你有没有考虑过这个词里面的大写?如果单词以'... Word'之类的标点符号开头怎么办?有没有例外?国际人物怎么样?
使用像Text :: Autoformat或Text :: Capitalize这样的CPAN模块可能会更好,这些问题已经解决了.
use Text::Capitalize 0.2; print capitalize_title($t), "\n"; use Text::Autoformat; print autoformat{case => "highlight", right=>length($t)}, $t;
听起来像Text :: Autoformat可能更"标准",我会首先尝试.它是达米安写的.但是Text :: Capitalize做了一些Text :: Autoformat没有的东西.这是一个比较.
您还可以查看有关如何使用正则表达式正确地将标题或标题大写的perl Cookbook for recipie 1.14(第31页).
像这样的东西应该做的伎俩 -
s!(^|\s)(\w)!$1\U$2!g
这简单地将扫描的表达式分成两个匹配 - 字符串的空白/开头为1美元,单词的第一个字符为2美元.然后我们在单词大写的开头后替换$ 1和$ 2.
我会将\ s更改为\ b,这更有意义,因为我们在这里检查字边界.