检查变量是否与子字符串列表匹配

时间:2018-12-27 01:35:51

标签: regex bash

我正在尝试编写一个过滤某些单词的脚本。

这是我使用的方法。它运行良好,但是当可能的比赛数量变得太大时,它就不再起作用了。我不确定此方法是否有某种限制。因此,欢迎有其他选择。

str="He is driving a car"
if [ "$str" != "${str/car/}" ] || [ "$str" != "${str/bus/}" ] || [ "$str" != "${str/truck/}" ] || [ "$str" != "${str/vehicle/}" ];then
echo "Substring found"
else
echo "Substring not found"
fi

3 个答案:

答案 0 :(得分:3)

我认为您的方法没有任何问题,尽管我会说编写时间很长。

由于您使用的是bash,因此可以使用扩展的glob,这可以大大减少代码的长度:

# enable extended globs
shopt -s extglob

# match anything containing car, bus, truck or vehicle
if [[ $str = *@(car|bus|truck|vehicle)* ]]; then
  echo "Substring found"
fi

# unset extended glob mode
shopt -u extglob

答案 1 :(得分:1)

或者您可以简单地使用以下正则表达式匹配运算符=~,将左边的字符串与右边的扩展正则表达式进行比较

str="He is driving a car"
vehicules="car|bus|truck|vehicle"

if [[ $str =~ $vehicules ]]; then
  echo "Substring found"
fi

也可以使用使用expr match的解决方案。

答案 2 :(得分:0)

这对我来说很好

case ${str} in car* | bus* | truck* | vehicle*)
    echo "Substring found"
esac