正規表現 - 無効な文字を見つける

正規表現 - 無効な文字を見つける

使用

regex='^[]0-9a-zA-Z,!^`@{}=().;/~_|[-]*$'

以下のスクリプトファイルで、指定された文字列に無効な文字が含まれていることを確認してください。

str="$1"

regex='^[]0-9a-zA-Z,!^`@{}=().;/~_|[-]+$'

if [[ $str =~ $regex ]]
then
  echo "matches"
  echo "Match: ${BASH_REMATCH[0]}"
else
  echo "doesn't match"
fi

BASH_REMATCHを使用して一致する文字列を取得するオプションがあるため、文字列が一致しない場合、文字列にどのような無効な文字があるかを取得するオプションはありますか?

答え1

組み込みオプションが表示されないため、次のアイデアがあります。

#!/bin/bash

str="$1"

regex='^[]0-9a-zA-Z,!^`@{}=().;/~_|[-]+$'

if [[ $str =~ $regex ]]
then
  echo "matches"
  echo "Match: ${BASH_REMATCH[0]}"
else
  echo "doesn't match"
  for (( i = 0; i < ${#str}; i++ )) do
    c=${str:$i:1}
    if [[ ! $c =~ $regex ]]
    then
      echo Non-matching character at index $i: "$c"
    fi
  done
fi

単に文字ごとに繰り返し、$strその文字を$regex

答え2

正規表現を無効にして見つけることができます最初無効な文字

現在の正規表現

$ str="in below script file I am checking if a given string has any invalid characters or not."
$ regex='^[]0-9a-zA-Z,!^`@{}=().;/~_|[-]+$'
$ [[ $str =~ $regex ]] && echo pass || echo fail
fail

空白では失敗します。正規表現の否定:行アンカーと末尾の+数量子を削除します。角かっこ式を否定します。セットがあります。いいえ有効な文字:

regex='[^]0-9a-zA-Z,!^`@{}=().;/~_|[-]'

それから

$ [[ $str =~ $regex ]] && echo "fail: found '${BASH_REMATCH[0]}'"
fail: found ' '

答え3

cls='],_[:alnum:]!^`@{}=().;/~|[-'

while getopts : na "-$str"
do    case $OPTARG   in ([!$cls])
           printf %s\\n "$OPTARG"
      esac
done

シェルのgetoptsオプションパーサーは、文字列を文字ごとに繰り返し削除し、最後に削除された文字をシェル変数に割り当てるように機能します。だからロープを分解したい場合はgetopts非常に便利です。次に、現在の繰り返しの機能をテストするだけです。有効性。一致した場合は維持し、一致し!ない場合はprintf維持します。

答え4

これにより、一致する文字がキャプチャされます。

regex=']0-9a-zA-Z,!^`@{}=().;/~_|[-'

echo "$str" | grep -oP '^['"$regex"']*'

varをキャプチャし、元の文字列の先頭から削除します。

head="$(echo "$str" | grep -oP '^['"$regex"']*')"

tail="${str#"$head"}"

最後に失敗した最初の文字を取得します。

failedChar="${tail:0:1}"          # higher shells method.
failedChar="${tail"${tail#?}"}"    # Alternative method.

BASH_REMATCHの使用

str="Testing that this is working."
regex=']0-9a-zA-Z,!^`@{}=().;/~_|[-'
[[ $str =~ ^[$regex]* ]]

head="${BASH_REMATCH[0]}"

tail="${str#"$head"}"

failedChar="${tail%"${tail#?}"}"

echo "fc |$failedChar| at position ${#head}"

関連情報