2016-07-15 62 views
0

我在猛砸接下來的兩個正則表達式:檢查如果字符串包含「 - 」和「]」在同一時間

1.^[-a-zA-Z0-9\,\.\;\:]*$ 
2.^[]a-zA-Z0-9\,\.\;\:]*$ 

的第一場比賽時,字符串中包含一個「 - 」和其他值。 第二個包含「]」時。 我把這個值放在我的正則表達式的開始處,因爲我無法對它們進行評估。 我如何能同時匹配兩個值?

+0

對於我的grep,如果你在右方括號'... \: - ]之前加上'-''(這是2),那麼它似乎就可以工作。 –

回答

2

您也可以將-年底支架表達,因爲範圍必須在兩端封閉。

^[]a-zA-Z0-9,.;:-]*$ 

您不必轉義任何其他字符。冒號,分號和逗號在正則表達式的任何部分都沒有特殊含義,而句號在括號表達式中失去其特殊含義。

+0

這也會匹配'aaaa',它不包含'''也不'''' – hek2mgl

+2

原來的正則表達式都是這樣;我只是回答如何在同一個括號表達式中包含']和'-'。 – chepner

+0

伊莫這個問題很明確。閱讀! :) – hek2mgl

0

也許,這可以幫助你

#!/bin/bash 
while read p; do 
echo $p | grep -E '\-.*\]|\].*\-' | grep "^[]a-zA-Z0-9,.;:-]*$" 
done <$1 

user-host:/tmp$ cat test 
-i]string 
]adfadfa- 
string- 
]string 
str]ing 
]123string 
123string- 
????? 
++++++ 


user-host:/tmp$ ./test.sh test 
-i]string 
]adfadfa- 
1

基本上你可以使用這個:

grep -E '^.*\-.*\[|\[.*\-.*$' 

它匹配任何一個-後跟零個或多個任意字符和[[後跟零個或多個字符和-

然而,由於您不接受任意字符,您需要將其更改爲:

grep -E '^[a-zA-Z0-9,.;:]*\-[a-zA-Z0-9,.;:]*\[|\[[a-zA-Z0-9,.;:]*\-[a-zA-Z0-9,.;:]*$' 
0

有兩個您的帖子中有問題。

  1. 一個是在說明:

    我怎麼能這兩個值同時獲得匹配嗎?

    這是一個OR比賽,它是用範圍內進行的是混合的兩個範圍:

    pattern='^[]a-zA-Z0-9,.;:-]*$' 
    

    這將匹配任何包含一個(或幾個)- ... OR ... ]線... OR任何包含的字符。這將是以下測試腳本中的所有行(除?????,++++++as df gh)。

  2. 二是在標題:

    ...字符串包含「 - 」和「]」在同一時間

    這是一個AND比賽。做到這一點最簡單的(和最慢)的方法是:

    echo "$line" | grep '-' | grep ']' | grep '^[-a-zA-Z0-9,.;:]*$' 
    

    前兩個電話給grep選擇該行:

    同時包含(一個或多個)-和(一個或幾個)]

測試腳本:

#!/bin/bash 

printlines(){ 
cat <<-\_test_lines_ 
asdfgh 
asdfgh- 
asdfgh] 
as]df 
as,df 
as.df 
as;df 
as:df 
as-df 
as]]]df 
as---df 
asAS]]]DFdf 
as123--456DF 
as,.;:-df 
as-dfg]h 
as]dfg-h 
a]s]d]f]g]h 
a]s]d]f]g]h- 
s-t-r-i-n-g] 
as]df-gh 
123]asdefgh 
123asd-fgh- 
????? 
++++++ 
as df gh 
_test_lines_ 
} 

pattern='^[]a-zA-Z0-9,.;:-]*$' 

printf '%s\n' "Testing the simple pattern of $pattern" 
while read line; do 
    resultgrep="$( echo "$line" | grep "$pattern" )" 
    printf '%13s %-13s\n' "$line" "$resultgrep" 
done < <(printlines) 
echo "#############################################################" 
echo 

p1='-'; p2=']'; p3='^[]a-zA-Z0-9,.;:-]*$' 

printf '%s\n' "Testing a 'grep AND' of '$p1', '$p2' and '$p3'." 
while read line; do 
    resultgrep="$( echo "$line" | grep "$p1" | grep "$p2" | grep "$p3" )" 
    [[ $resultgrep ]] && printf '%13s %-13s\n' "$line" "$resultgrep" 
done < <(printlines) 
echo "#############################################################" 
echo 

printf '%s\n' "Testing an 'AWK AND' of '$p1', '$p2' and '$p3'." 
while read line; do 
    resultawk="$( echo "$line" | 
    awk -v p1="$p1" -v p2="$p2" -v p3="$p3" '$0~p1 && $0~p2 && $0~p3')" 
    [[ $resultawk ]] && printf '%13s %-13s\n' "$line" "$resultawk" 
done < <(printlines) 
echo "#############################################################" 
echo 

printf '%s\n' "Testing a 'bash AND' of '$p1', '$p2' and '$p3'." 
while read line; do 
    rgrep="$( echo "$line" | grep "$p1" | grep "$p2" | grep "$p3" )" 
    [[ ($line =~ $p1) && ($line =~ $p2) && ($line =~ $p3) ]] 
    rbash=${BASH_REMATCH[0]} 
    [[ $rbash ]] && printf '%13s %-13s %-13s\n' "$line" "$rgrep" "$rbash" 
done < <(printlines) 
echo "#############################################################" 
echo 
相關問題