2016-08-11 198 views
5

我試圖用一個約束來提取單詞[a-zA-Z]+:一個單詞必須包含至少一個小寫字母和至少一個大寫字母(在任意位置這個單詞)。例如:如果輸入是hello 123 worLD,唯一的匹配應該是worLD匹配至少一個小寫字母和至少一個大寫字母

我試圖用積極的向前看符號是這樣的:

echo "hello 123 worLD" | grep -oP "(?=.*[a-z])(?=.*[A-Z])[a-zA-Z]+" 
hello 

這是不正確的:唯一的比賽是hello,而不是worLD。然後我試過這個:

echo "hello 123 worLD" | grep -oP "\K((?=.*[a-z])(?=.*[A-Z])[a-zA-Z]+)" 
hello 
worLD 

這仍然是不正確的:hello不應該匹配。

回答

4

在lookaheads中的.*不僅在相鄰的單詞中檢查信件的存在,而且在後面的字符串中檢查信件的存在。使用[a-zA-Z]*

echo "hello 123 worLD" | grep -oP "\\b(?=[A-Za-z]*[a-z])(?=[A-Za-z]*[A-Z])[a-zA-Z]+" 

demo online

我也開始添加一個單詞邊界\b,使先行檢查是一個字邊界後,才執行。

1

答:

echo "hello 123 worLD" | grep -oP "\b(?=[A-Z]+[a-z]|[a-z]+[A-Z])[a-zA-Z]*" 

演示:https://ideone.com/HjLH5o

說明:如果字與一個或多個大寫字母后跟一個小寫字母開始

首先檢查反之亦然跟隨以任意數量的小寫字母和大寫字母按任意順序排列。

性能:

This solution需要31個步驟,以達到所提供的測試字符串匹配,而accepted solution需要47個步驟。

相關問題