2014-07-01 65 views
3

使用Perl,我試圖替換所有圍繞由空格分隔的單詞的括號。例如,字符串:正則表達式刪除由空格分隔的字符周圍的括號

$string = "A string (with words) is always easy to understand Ref: A(1,2)"; 

應該成爲

$string = "A string with words is always easy to understand Ref: A(1,2)"; 

我可以拿起匹配使用lookarounds,但不能確定如何更換括號,而不是字,即

$string =~ s/(?<=\s\()\w*(?=\)\s)//g; 

會給

$string = "A string() is always easy to understand Ref: A(1,2)"; 

是否可以設置一個正則表達式來替換搜索結果而不是匹配?或者我在想這個錯誤?

回答

7

使用capturing groups

$string =~ s/(\s)\(([^)]*)\)(\s)/$1$2$3/g; 

或者如果你喜歡:

$string =~ s/\s\K\(([^)]*)\)(?=\s)/$1/g; 

(如果要刪除括號,括號必須包含在全場比賽的結果)。

+0

太棒了!新的正則表達式,並要瞭解現在捕獲組。 –

+0

@JamesB:你可以按照我剛剛在我的回答中添加的鏈接。 –

+0

@Casimir et Hippolyte也許這會更好地問一個新的問題,但你將如何處理嵌套圓括號組,即「」一個字符串(有(更多)字)總是(容易)理解Ref:A(1,2 )「'導致''帶有更多單詞的字符串總是容易理解Ref:A(1,2)」'。 – Chris

1

上述答案略有差異:

s/\s+\(([^)]*)\)\s+/ $1 /;

請注意\ s上的「+號」。它允許括號周圍有一個或多個空格。另請注意,$ 1的兩邊都有一個空格。

Notepad ++在這些情況下可能相當有幫助。它使用與Perl相同的$ 1語法。

Ĵ弗裏德爾在主正則表達式廣義這個問題(略轉述):

  1. 比賽的開始分隔符
  2. 匹配的正文(什麼是 沒有結束符)
  3. 匹配的結尾分隔符

聽起來很簡單,但有時很容易失去跟蹤。

0

有兩點不同,使括號,你不想刪除獨特:

  1. 它是由一個字母字符包圍
  2. 它僅包含數字和標點符號(無空格)

你的目標的描述是含糊不清,可以適用於這兩種區別:

「用空格分開字符

鑑於您選擇了卡西米爾的答案,我會假定您的意思是#1的區別。然而,允許在開頭或字符串的結尾括號,你應該使用負前瞻和lookbehinds的邊界條件,而不是空格字符類:

my $string = "A string (with words) is always easy to understand Ref: A(1,2)"; 

$string =~ s/(?<!\S)\(([^)]*)\)(?!\S)/$1/g; 

print $string; 

輸出:

A string with words is always easy to understand Ref: A(1,2) 

爲了更加寬容,也許你只想排除在單詞字符旁邊擁抱的括號,但是仍然去除標點符號旁邊的括號。如果是這樣的話,那麼你只需要將正則表達式調整爲:

$string =~ s/(?<!\w)\(([^)]*)\)(?!\w)/$1/g; 
相關問題