2012-07-18 79 views
0

我需要「註解」以X形正則表達式的每個匹配,例如,如果我有這樣一個文本文件:詮釋不匹配

Line1Name: this is a (string). 
Line2Name: (a string) 
Line3Name this is a line without parenthesis 
Line4Name: (a string 2) 

現在下面的正則表達式將之前匹配所有答:

^[^:]+(?=:) 

這樣的結果將是

Line1Name: 
Line2Name: 
Line4Name: 

但是我需要註釋第3行的不匹配,有這樣的輸出:

Line1Name: 
Line2Name: 
X 
Line4Name: 

這是可能的正則表達式嗎?

+1

您可以嘗試使用腳本語言來查找是否使用給定的正則表達式匹配它。 – Jithin 2012-07-18 05:51:09

+0

'awk'/^[^:] +:/ {print $ 1;下一步} {打印「X」}'文件' – tripleee 2012-07-18 06:41:55

回答

1

如果你看看正則表達式是什麼,你會意識到不可能僅用一個正則表達式來進行邏輯運算。引述Wikipedia

在計算中,正則表達式提供一個簡明的和靈活的方法,以「匹配」(指定和識別)文本字符串,如特定的字符,單詞或字符的圖案。

強調我的 - 簡單地說,正則表達式是找到字符串的奇特方式;它要麼(它匹配),要麼不會。

爲了實現您的目標,您需要某種邏輯開關,用於對正則表達式搜索的匹配/不匹配結果進行操作並觸發一個操作。你有沒有在您使用您正則表達式什麼樣的環境,因此提供了一個解決方案是一個有點毫無意義的規定,但作爲一個例子,這個會做什麼你想在純bash做:

# assuming your string is in $str 
result="$([[ $str =~ ^[^:]+: ]] && echo "${str%:*}" || echo "X")" 

這做同樣的事情在語言支持您的正則表達式(紅寶石):

# assuming your string is in str 
result = str.match(/^[^:]+(?=:)/) || "X" 

作爲一個側面說明,您的示例代碼的輸出不匹配:您使用的是超前的結腸癌,其排除在比賽,但你的輸出包括它。在我的示例中,我選擇在您的輸出模式中使用正則表達式,因此從結果中排除冒號。

+0

在bash解決方案中使用2種技術:正則表達式匹配測試和模式匹配回顯,在我看來,使用BASH_REMATCH會更容易理解。 – nshy 2012-07-21 15:45:04

+0

@nshy:對於聲明的清晰性是真實的,但是我必須在BASH_REMATCH上使用模式匹配,而不是使用尾部冒號(請參閱我的答案的最後一段,爲什麼我忽略匹配中的冒號)因爲[擴展正則表達式不支持lookahead斷言](http://developer.apple.com/documentation/Darwin/Reference/Manpages/man7/re_format.7.html)。 – kopischke 2012-07-21 16:40:15