2011-10-13 51 views
4

请考虑以下字符串如何用大写字母替换特定字符?

String = “这是测试,我是新来的perl!请帮助,我可以帮助吗?我希望如此。

在上述字符串.?!之后的下一个字符应为大写。我怎样才能做到这一点?

我正在逐行阅读文本文件,我需要将修改后的数据写入另一个文件。

您的帮助将不胜感激。

+0

酷家伙现在的工作 – Sirga

回答

12

,你可以使用正则表达式 试试这个:

my $s = "..."; 
$s =~ s/([\.\?!]\s*[a-z])/uc($1)/ge; # of course $1 , thanks to plusplus 

的G标志的所有匹配搜索和电子标志执行UC转换的字母为大写

说明:

  • 用[。\ ?!]搜索标点符号
  • \ s *用于空格之间的空格标记和你的下一个字的第一个字母和
  • [AZ]上的单个字母匹配(在这种情况下一个字

以上的搜索提到与这些模式对于每个正则表达式中的第一个出现一个标点符号后跟(可选)空格和一个字母,并用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. 
+0

thanx为您的重播,但我没有得到你可以举一个例子。 – Sirga

+2

它应该是在'uc()'中的'$ 1'而不是'&1' – plusplus

+0

在你的帮助测试中暗示你自己引用:-) –

2

可以使用替换操作s///

$string =~ s/([.?!]\s*\S)/ uc($1) /ge; 
+2

这个答案可能会有一些评论,特别是考虑到OP是Perl新手。 –

+1

@nathan OP实际上并没有说他是Perl的新手,只是他的示例字符串中的文本。 – TLP

+0

@TLP:他在示例文本中写了它。 –

0

编辑 - 完全误解的问题,还以为你只是问到由于某种原因大写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. 
+0

非常感谢各位好友。我跳它会工作。 – Sirga

1

这里有一个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; 
} 
+1

你需要正则表达式来拆分;) – Hachi

+0

@Hachi请原谅你的赦免? – TLP

+0

@Hachi哦,我明白你的意思了。是的,我想我在那里丢球。 – TLP

相关问题