정규식 - 잘못된 문자 찾기

정규식 - 잘못된 문자 찾기

사용

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}"

관련 정보