2017-05-06 134 views
1

想要清除一些文本。所以,要刪除除\w\s之外的任何內容,還要保留單詞內部的單個'。 (如想保持它在的話就像don't刪除單詞中的任何非單詞字符,但空格和單引號

我能做

perl -plE "s/[^\w\s']//g" <<< "'a:b/c d????ef' don't" 

其保持',但它保持它也是在開始時或結束字符串,例如,它打印

'abc def' don't 

我無法執行保留此(?<\w)'(?=\w),例如刪除',除非它位於兩個單詞字符之間

通緝結果:

abc def don't 

如何做到這一點?

回答

3

你可以這樣做:

s/[^\w\s']|(?<!\w)'|'(?!\w)//g 

刪除一切,要麼是

  • 不是(一個字字符或空格或'),或
  • 一個'一個字符前面沒有一個單詞字符,或者
  • a '沒有跟着單詞字符

第一個子句將匹配(和刪除)我們顯然不想保留的所有字符。

第二個和第三個子句將刪除所有'個字符,除非它們被雙方的單詞字符包圍。

+1

你應該用'\ B取代您lookarounds '。 –

+0

@CasimiretHippolyte真的,那會有同樣的效果。這可能需要我多一點的時間來閱讀/理解,但是, – melpomene

2

你也可以使用一個全球性的研究,而不是替代品,這樣你只需要描述你想保留什麼,圖案變得更加簡單:

perl -ne"print /[\w\s]|\b'\b/g" <<< "'a:b/c d????ef' don't" 
+0

太棒了!如果我理解正確,'\ b'\ b'與'(?<\ w)'(?= \ w)'相同,但**更簡單。 :) – Nemo

+0

@Nemo:是的,這個想法是找到字邊界,包圍字邊界的單詞字符,空格和引號,而不是搜索所有其他案例來替換它們。不要忘記你的lookbehinds'(?<= ...)'中的'=' –

相關問題