2010-05-17 14 views
3

我試圖識別並壓縮字符串中的單個(大寫)字符。如何在Perl中壓縮獨立字符?

例如:

「測試AB測試」 - > 「測試AB測試」

「測試ABC測試」 - > 「測試ABC測試」

「測試AB測試CDE測試」 - >「測試AB測試CDE測試」

我有它的單一事件工作(如在上面的第一個例子),但不知道如何鏈接它多次發生。

$str =~ s/ ([A-Z]) ([A-Z])/\1\2 /g; 

當我看到解決方案時,我可能會覺得很蠢,但我已經爲此做好了準備。提前致謝。

回答

2
$str =~ s/\b([A-Z])\s+(?=[A-Z]\b)/$1/g; 
+0

我看到「\ 1」被更改爲「$ 1」。這兩個版本似乎都有效......所以有什麼不同? – brydgesk 2010-05-17 18:16:38

+0

字邊界斷言('\ b')可能不是您想要的。如果字符串「A B C!」應該成爲「AB C!」,那麼您需要使用別的東西。另外,如果'「A B C1」'應該變成'「ABC1」',那麼你將需要使用別的東西。 – 2010-05-17 18:18:27

+0

@brydgesk讀取'perl -Mdiagnostics -e'$「=〜s /(a)/ \ 1 /''的輸出''基本上它是一種樣式和一致性問題(例如'\ 10'可能並不意味着你認爲它的確如此,但'$ 10'確實如此) – 2010-05-17 18:23:32

1

原因它不工作的是,你已經領先並在您的正則尾隨空格。一旦「A B C」變成「AB C」,B不再有領先空間 - A就在那裏。

最簡單的解決方法是取出並使用s/([A-Z]) ([A-Z])/\1\2/g,它應該滿足規定的要求,但它也會將全部蓋帽的短語變成一個單一的字母塊(例如,「這是一個測試」 - >「 THISISATEST「),這可能不被你接受。

如果您只需要摺疊單個大寫字母而不是它們的組(例如,「FOR IMA TEST」 - >「FOR IMA TEST」,而不是「FORIMATEST」),那麼我認爲這是不可能的單個正則表達式。你必須做兩次,一次是標記哪些空間要塌縮,另一次是實際刪除標記(例如,「IMA TEST」 - >「I^M^A TEST」 - >「FOR IMA TEST「),因爲否則無法區分最初配對的一對大寫字母和最初空格分隔但已摺疊的一對大寫字母。