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