2011-10-13 50 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

相關問題