请考虑以下字符串如何用大写字母替换特定字符?
String = “这是测试,我是新来的perl!请帮助,我可以帮助吗?我希望如此。
在上述字符串.
或?
或!
之后的下一个字符应为大写。我怎样才能做到这一点?
我正在逐行阅读文本文件,我需要将修改后的数据写入另一个文件。
您的帮助将不胜感激。
请考虑以下字符串如何用大写字母替换特定字符?
String = “这是测试,我是新来的perl!请帮助,我可以帮助吗?我希望如此。
在上述字符串.
或?
或!
之后的下一个字符应为大写。我怎样才能做到这一点?
我正在逐行阅读文本文件,我需要将修改后的数据写入另一个文件。
您的帮助将不胜感激。
,你可以使用正则表达式 试试这个:
my $s = "...";
$s =~ s/([\.\?!]\s*[a-z])/uc($1)/ge; # of course $1 , thanks to plusplus
的G标志的所有匹配搜索和电子标志执行UC转换的字母为大写
说明:
以上的搜索提到与这些模式对于每个正则表达式中的第一个出现一个标点符号后跟(可选)空格和一个字母,并用uc的结果(将匹配转换为大写)替换它。
例如: “我!” “P” 则
my $s = "this is for test. i'm new to perl! Please help. can u help? i hope so.";
$s =~ s/([\.\?!]\s*[a-z])/uc(&1)/ge;
print $s;
会发现, “c” 和 “?我” 和替换,所以打印的结果是:
this is for test. I'm new to perl! Please help. Can u help? I hope so.
可以使用替换操作s///
:
$string =~ s/([.?!]\s*\S)/ uc($1) /ge;
这个答案可能会有一些评论,特别是考虑到OP是Perl新手。 –
@nathan OP实际上并没有说他是Perl的新手,只是他的示例字符串中的文本。 – TLP
@TLP:他在示例文本中写了它。 –
编辑 - 完全误解的问题,还以为你只是问到由于某种原因大写i
,为任何混淆道歉!
作为迄今为止的答案状态,您可以查看正则表达式,并使用替换运算符(s///)
。没有人提到过\b
(字边界)字符,这对于找到单个的i
可能很有用,否则你将不得不在字符类匹配中添加标点符号([ ... ]
)。
例如
my $x = "this is for test. i'm new to perl! Please help. can u help? i hope so. ".
\"i want it to work!\". Dave, Bob, Henry viii and i are friends. foo i bar.";
$x =~ s/\bi\b/I/g; # or could use the capture() and uc($1) in eugene's answer
给出:
# this is for test. I'm new to perl! Please help. can u help? I hope so.
# "I want it to work!". Dave, Bob, Henry viii and I are friends. foo I bar.
非常感谢各位好友。我跳它会工作。 – Sirga
这里有一个split
解决方案:
$str = "this is for test. im new to perl! Please help. can u help? i hope so.";
say join "", map ucfirst, split /([?!.]\s*)/, $str;
如果你正在做的是打印到一个新的文件,你并不需要加入字符串返回向上。例如。
while ($line = <$input>) {
print $output map ucfirst, split /([?!.]\s*)/, $line;
}
酷家伙现在的工作 – Sirga