Bash中不区分大小写的正则表达式

问题描述 投票:3回答:2

我想知道哪种方法更好,以不区分大小写的方式检查var(键盘上的用户输入)是否与正则表达式匹配。我知道有一些不同的可能性。示例:我想要一个匹配空值的正则表达式和所有这个列表:YNynYesNoYESNO

我搜索了不同的方法。不确定是否可能是另一个更好的。我会让他们中的几个为我工作。

  • 第一个是一个小的“棘手”设置全部为大写进行比较: #!/bin/bash yesno="null" #any different value for initialization is valid while [[ ! ${yesno^^} =~ ^[YN]$|^YES$|^NO$|^$ ]]; do read -r yesno done
  • 第二个是使用shopt -s nocasematch。但不确定在执行此操作之后是否可以恢复,因为我不想为所有脚本设置此项。 #!/bin/bash yesno="null" #any different value for initialization is valid shopt -s nocasematch while [[ ! ${yesno} =~ ^[yn]$|^yes$|^no$|^$ ]]; do read -r yesno done

这些正则表达式能否以任何方式得到改善?有更好(更优雅)的方法吗?在第二种方法,有没有办法恢复该设置?

regex bash case-insensitive
2个回答
2
投票

shopt是一个很好的方法,因为你能够在变量yesno中保留最初输入的值。

你可以稍微重构你的正则表达式:

#!/bin/bash

yesno="null"

# set nocasematch option
shopt -s nocasematch

while [[ ! ${yesno} =~ ^([yn]|yes|no)?$ ]]; do
    read -r -p "Enter a yes/no value: " yesno
done

# unset nocasematch option
shopt -u nocasematch

# examine your variable
declare -p yesno

3
投票

您可以先将字符串转换为小写并进行检查。然后你根本不需要触摸nocasematch。变量的内容也保持不变。

# use the ${var,,} syntax to conver to lowercase
while [[ ! ${yesno,,} =~ ^(y|n|yes|no)$ ]]; do
    read -r -p "yes/no? " yesno
done
© www.soinside.com 2019 - 2024. All rights reserved.