如何在 Perl 中将字符串中每个单词的首字母大写?
Posted
技术标签:
【中文标题】如何在 Perl 中将字符串中每个单词的首字母大写?【英文标题】:How can I capitalize the first letter of each word in a string in Perl? 【发布时间】:2010-09-09 18:51:00 【问题描述】:将字符串中每个单词的首字母大写的最简单方法是什么?
【问题讨论】:
【参考方案1】:见the faq。
我不相信ucfirst()
满足 OP 的问题,即在不拆分字符串并稍后加入的情况下将字符串中每个单词的首字母大写。
【讨论】:
Err,\U 是通过调用 ucfirst 在内部实现的,因此您对此的陈述与您自己的建议相矛盾。 :-) s///g 开关会迭代,所以它会处理整个字符串。当我第一次看到另一个答案只是“查看 ucfirst 函数”时,我觉得至少应该提到更多关于拆分/加入的信息,而且我看到发帖的人已经编辑了这些内容。 您不想使用您给出的建议,这是常见问题解答用来显示错误方法的代码。在那一点之后阅读文本,我解释了为什么这个答案是错误的。 :) 我现在修改了常见问题解答,删除了每个人都因为没有阅读第二段而锁定的错误答案。【参考方案2】:试试这个:
echo "what's the wrong answer?" |perl -pe 's/^/ /; s/\s(\w+)/ \u$1/g; s/^ //'
输出将是:
What's The Wrong Answer?
【讨论】:
【参考方案3】:$capitalized = join '', map ucfirst lc $_ split /(\s+)/, $line;
通过捕获空白,将其插入列表中并用于重建原始间距。 "ucfirst lc" 将 "teXT" 大写为 "Text"。
【讨论】:
不处理"bill o’hanlon"
。
你可能想使用split /(\W+)/
。【参考方案4】:
您可以使用“Title Case”,这是一段用 Perl 编写的非常酷的代码。
【讨论】:
【参考方案5】:正如@brian 在 cmets 中提到的,@piCookie 当前接受的答案是错误的!
$_="what's the wrong answer?";
s/\b(\w)/\U$1/g
print;
这将打印“What'S The Wrong Answer?”注意大写错误的 S
正如FAQ 所说,您最好使用
s/([\w']+)/\u\L$1/g
或Text::Autoformat
【讨论】:
【参考方案6】:这仅将每行的第一个单词大写:
perl -ne "print (ucfirst($1)$2) if s/^(\w)(.*)/\1\2/" file
【讨论】:
【参考方案7】:地图中的ucfirst 函数确实可以做到这一点,但只是以非常基本的方式。如果您想要更复杂的东西,请查看John Gruber's TitleCase script。
【讨论】:
【参考方案8】:请注意,如果您的单词全部大写并且您希望它们(仅)大写,则常见问题解答解决方案不起作用。您可以制作一个更复杂的正则表达式,或者在应用 FAQ 解决方案之前对字符串执行 lc。
【讨论】:
FAQ 解决方案工作得很好,因为FAQ 中实际上有几个解决方案。最好的解决方案是 Damian 的 Text::Autoformat,它正好解决了您的问题。【参考方案9】:$string =~ s/(\w+)/\u$1/g;
应该没问题
【讨论】:
这不是大写整个字符串,而不是每个单词的第一个字母吗? @briandfoy:您的链接已损坏。指向这个:learn.perl.org/faq/… 如果您添加一个空格,这可能会起作用:s/ (\w+)/\u$1/g;
。【参考方案10】:
看看ucfirst函数。
$line = join " ", map ucfirst split " ", $line;
【讨论】:
请注意 split(" ", $line) 在任意空格上拆分,因此不会保留所有空格。 同意;正确答案是$line = join " ", map ucfirst split / /, $line;
(注意“改为/)
@Ether:更接近,但它仍然会去除 尾随 空格(并且不会识别仅由 \t
分隔的单词)。
更大的问题是ucfirst
实际上并没有小写字符串。标题大小写不是FOO
,这不会解决这个问题。以上是关于如何在 Perl 中将字符串中每个单词的首字母大写?的主要内容,如果未能解决你的问题,请参考以下文章
php 助手 - 将字符串转换为标题案例(每个单词的首字母大写,除了小字)