正则表达式 - 查找无效字符

正则表达式 - 查找无效字符

使用

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

shell 的getopts选项解析器通过迭代地逐个字符地剥离字符串并将其最近剥离的字符分配给 shell 变量来工作。所以如果你想把一根绳子拆开,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}"

相关内容