我正在寻找一个Perl正则表达式,它将大写任何以空格开头的字符(或字符串中的第一个字符)。
我很确定有一种简单的方法可以做到这一点,但我没有方便的Perl书,而且我不经常这样做,我已经记住了它......
答案 0 :(得分:10)
s/(\s\w)/\U$1\E/g;
我最初建议:
s/\s\w/\U$&\E/g;
但是在使用'$&'时警报响起(甚至在我阅读@Manni的评论之前)。事实证明它们是完全合理的 - 使用$&,$`和$'操作会导致正则表达式整体效率低下。
\ E对于这个正则表达式并不重要;在这种情况下,它会关闭“案例设置”开关\U
,或者对于小写,会关闭\L
。
如评论中所述,匹配字符串的第一个字符需要:
s/((?:^|\s)\w)/\U$1\E/g;
更正了第二个右括号的位置 - 谢谢,Blixtor。
答案 1 :(得分:8)
根据您的确切问题,这可能比您想象的更复杂,并且简单的正则表达式可能无效。你有没有考虑过这个词里面的大写?如果单词以'... Word'之类的标点符号开头怎么办?有没有例外?国际人物怎么样?
最好使用CPAN模块,如Text::Autoformat或Text::Capitalize这些问题已经解决。
use Text::Capitalize 0.2;
print capitalize_title($t), "\n";
use Text::Autoformat;
print autoformat{case => "highlight", right=>length($t)}, $t;
听起来像Text :: Autoformat可能更“标准”,我会首先尝试。它由Damian撰写。但是Text :: Capitalize做了一些Text :: Autoformat没有的东西。这是一个comparison。
您还可以查看有关如何使用正则表达式正确大写标题或标题的Perl Cookbook以获取第1.14页(第31页)。
答案 2 :(得分:7)
这样的事情可以解决问题 -
s!(^|\s)(\w)!$1\U$2!g
这简单地将扫描的表达式分成两个匹配 - 字符串的空白/开头为1美元,单词的第一个字符为2美元。然后我们在开始使用大写单词后替换$ 1和$ 2。
我会将\ s更改为\ b,这更有意义,因为我们在这里检查字边界。
答案 3 :(得分:1)
这不是我通常使用正则表达式的东西,但我的解决方案并不完全是你所谓的“漂亮”:
$string = join("", map(ucfirst, split(/(\s+)/, $string)));
split()
字符串按空格并捕获所有空格,然后遍历列表中的每个元素并对它们ucfirst
(使第一个字符为大写),然后{{1}将它们作为单个字符串重新组合在一起。不是很糟糕,但也许你会更喜欢正则表达式。我个人不喜欢join()
或\Q
或其他半笨拙的正则表达式构造。
\U
改为:
...string
即。即使在他们面前有标点符号,你也希望单词大写,尝试更像这样的东西:
...String
同样的事情,但它$string = join("", map(ucfirst, split(/(\w+)/, $string)));
在单词(split()
)上,因此列表中捕获的元素只是单词。相同的整体效果,但会将可能不以单词字符开头的单词大写。将\w+
更改为\w
以消除尝试大写数字的问题。而且只要你喜欢就调整它。
答案 4 :(得分:1)
如果您指的是空格后的字符,请使用\s
使用正则表达式。如果你真的是指单词中的第一个字符,你应该使用\b
而不是\s
的所有上述尝试都容易出错。
s/\b(\w)/\U$1/g;
答案 5 :(得分:0)
您希望匹配空格后面的字母,或字符串的开头。
Perl不能做可变长度的lookbehind。如果是这样,你可以使用它:
s/(?<=\s|^)(\w)/\u$1/g; # this does not work!
Perl抱怨道:
Variable length lookbehind not implemented in regex;
你可以使用双重负面的lookbehind来解决这个问题:左边的东西不能是任何不是空白的东西。这意味着它将在字符串的开头匹配,但如果前面有任何内容,它必须是空格。
s/(?<!\S)(\w)/\u$1/g;
在这个确切的情况下,更简单的方法可能只是匹配空白;然后,可变长度限制就会消失,并将其包含在替换中。
s/(\s|^)(\w)/$1\u$2/g;
偶尔你不能在重复替换中使用这种方法,因为实际匹配之前的东西已经被正则表达式吃掉了,并且最好绕过它。
答案 6 :(得分:0)
将任何以空格开头或字符串开头的字符大写:
s/(^|\s)./\u$1/g
这可能是一种非常草率的方式,因为它现在也在增加空白。 :P 它的优点是它可以与带有所有可能重音的字母(以及特殊的丹麦语/瑞典语/挪威语字母)一起使用,当你在正则表达式中使用\ w和\ b时会出现问题。我可以期望所有非字母都不受大写修饰符的影响吗?