什么正则表达式将空格后的任何字母大写?

时间:2009-03-09 14:41:43

标签: regex perl

我正在寻找一个Perl正则表达式,它将大写任何以空格开头的字符(或字符串中的第一个字符)。

我很确定有一种简单的方法可以做到这一点,但我没有方便的Perl书,而且我不经常这样做,我已经记住了它......

7 个答案:

答案 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::AutoformatText::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时会出现问题。我可以期望所有非字母都不受大写修饰符的影响吗?