如何匹配被空格包围的字符串中的确切单词?

How can I match an exact word within a string that is surrounded by whitespaces?

我正在尝试根据一组允许的命令使用正则表达式匹配特定命令。

这是我想要达到的结果:

foo --happy-cat run meow # valid command
foo --happy-cat test meow # valid command
foo --happy-cat run-away woof # invalid command

这是我尝试过的

case $* in
  (*run* | *test* | *build*) echo yes ;;
  *) echo no ;;
esac

什么不起作用 我的比赛将 run-away 错误地匹配为有效命令。我只想匹配 runtestbuild 被空格

包围

您必须像这样匹配给定单词周围的空格:

case "$*" in
  *" run "*|*" test "*|*" build "*) echo yes ;;
  *) echo no ;;
esac

这也被称为 glob 匹配而不是正则表达式。

上面的脚本将匹配 " run " 并打印 yes,但是对于 run-away 它将不匹配第一组 glob 并将打印 no.

要添加到 anubhava 的回答中,如果您想使用实际的正则表达式,您可以这样做:

s='foo --happy-cat run-away woof'  # test string
regex='\s+((run)|(test)|(build))\s+'

if [[ $s =~ $regex ]]
then
  echo "yes"
else
  echo "no"
fi

这具有匹配白色 space 的优点,它不仅 space,还匹配制表符。