web-dev-qa-db-ja.com

Bash:正規表現を使用した文字列の完全一致

正規表現で文字列を完全に一致させる必要があります。私はこのパターンを理解する必要があります:toCheckは$ str1の2つのオカレンスで始まり、$ str2の最大1つのオカレンスで始まる必要があります。 toCheckがパターンに一致する場合、出力内に$ toCheck:successを書き込む必要があります。それ以外の場合は$ toCheck:failedです。

私はこの正規表現を書いた:

regex="$1($1)+$2"

サイトregexr.comを使用して、たとえば次のように挿入しました。

regex="lo(lo)ba"
toCheck="loloba"

それは成功です。

Regerx.comでは、この試合は最後のbaまで続きます。

toCheck="lolobaba"

しかし、私のbashコードでは、それは成功です。

これは完全なコードです:

toCheck="lolobaba"
regex="lo(lo)+ba"

if [[ $toCheck =~ $regex ]]; then

    echo "$toCheck:success" > output
else
    echo "$toCheck:failed" > output
fi

したがって、問題は、文字列と正規表現を完全に一致させる方法ですか?

6
Federico Ponzi

正規表現が部分に一致するため、成功します。

exactの一致が必要な場合は、パターンを行の先頭と末尾にアンカーする必要があります:regex="^lo(lo)+ba$"

  • ^は文字列の始まりを表します:パターンの前には何もありません
  • $は文字列の終わりを意味します。

元のコードでは、パターンがアンカーされていないため、文字列の少なくとも一部がパターンを検証する場合、パターンマッチングは前後の関係を考慮しません。

7
Seki

括弧は何ですか? 2x $ str1で始まり、最大1x $ str2で終わる必要があります

っていうことは

    if [[ $toCheck =~ ^$str1$str1($str2|)$ ]] ; then
        echo "$toCheck:success" > output
    else
        echo "$toCheck:failed" > output
    fi
1
ladiko