当前位置: 首页 > 知识库问答 >
问题:

Bash if语句中的Regex匹配

袁山
2023-03-14

我在这里做错了什么?

尝试匹配任何包含空格、小写、大写或数字的字符串。特殊字符也很好,但我认为这需要转义某些字符。

TEST="THIS is a TEST title with some numbers 12345 and special char *&^%$#"

if [[ "$TEST" =~ [^a-zA-Z0-9\ ] ]]; then BLAH; fi

这显然只测试上限、下限、数字和空格。但不管用。

if [[ "$TITLE" =~ [^a-zA-Z0-9\ ] ]]; then RETURN="FAIL" && ERROR="ERROR: Title can only contain upper and lowercase letters, numbers, and spaces!"; fi

*更新*

./anm.sh: line 265: syntax error in conditional expression
./anm.sh: line 265: syntax error near `&*#]'
./anm.sh: line 265: `  if [[ ! "$TITLE" =~ [a-zA-Z0-9 $%^\&*#] ]]; then RETURN="FAIL" && ERROR="ERROR: Title can only contain upper and lowercase letters, numbers, and spaces!"; return; fi'

共有1个答案

糜鸿风
2023-03-14

关于Bash的[[]]构造,有几件重要的事情需要了解。第一个:

不对[[]]之间的单词执行单词拆分和路径名扩展;进行了字段扩展、参数和变量扩展、算术扩展、命令替换、进程替换和引号删除。

第二件事:

pat="[0-9a-zA-Z ]"
if [[ $x =~ $pat ]]; then ...
# This doesn't work:
if [[ $x =~ "$pat" ]]; then ...

最后,我认为您试图做的是验证变量只包含有效字符。进行此检查的最简单方法是确保它不包含无效字符。换句话说,像这样的表达式:

valid='0-9a-zA-Z $%&#' # add almost whatever else you want to allow to the list
if [[ ! $x =~ [^$valid] ]]; then ...

否定测试,将其转换为“不匹配”运算符,而[^...]regex字符类表示“...以外的任何字符”。

参数扩展和regex运算符的组合可以使bash正则表达式语法“几乎可读”,但仍有一些困难。(不是一直都有吗?)一个是,您不能将]放入$valid中,即使$valid加引号,但开头除外。(这是一个Posix regex规则:如果您想在字符类中包含],它需要在开头进行。-可以在开头或结尾进行,因此如果同时需要]-,则需要以]开头,以-结尾,导致regex“我知道我在做什么”表情符号:[][-])

 类似资料:
  • 我已经使用这个正则表达式测试器来检查我的正则表达式是否有效:http://regex101.com/ 当我在RegEx-tester中输入RegEx时,它显示子字符串被捕获。 现在我想使用正则表达式从文件中 grep 子字符串。到目前为止,我对这个说法没有运气: grep 不会抛出任何错误。它根本不会像找不到匹配项时那样给出结果。 我尝试过用反斜杠来转义grep语句中的撇号,但是没有用。 非常感谢

  • 我正在使用做类似“语法分析器”的事情,使用(常规表达式)。 我只想检查基本操作的有效语法(如|-|*|/|(|))。用户将字符串(用键盘)粘贴到磁带上,我用regex对其进行验证。但我不知道如何在if语句中使用regex。我想要的是:如果用户带给我的字符串不正确(或者没有使用regex检查),请打印类似“inavlid string”的内容,如果正确,请打印“Valid string”。 我尝试过

  • 我试图找出如何将regex合并到python if语句中。我有一个pandas数据框架,在其中我迭代行,并希望在每一行具有特定的文本组合时执行一个操作。正则表达式应匹配任何以大写字母开头,后跟6个数字(即R142389)的7个字符串 我这样做对吗?任何帮助都将不胜感激!

  • 问题内容: 我有一个很长的查询,本质上是以下内容的扩展: 完成后,其中的where子句将有约40行。为了使此任务更容易,我希望做与以下类似的事情: 不幸的是,lease_id不是唯一字段,同一个suite_id可以有多个lease_id(因此,第二个查询不可用)。 鉴于此解决方案无法正常工作,是否有更好的方法来执行第一条更新语句? 问题答案: 您可以创建表类型并通过它传递值,如下所示: 如果您使用

  • 我正在通过drools-guvnor创建规则。我已经导入了我的POJO模型,并且一切都设置正确(我已经进行了测试),但我似乎无法弄清楚如何让“匹配”运算符正确工作。这是我到目前为止所拥有的(源代码): 有谁能给我一些关于在drools guvnor中使用多个正则表达式检查的提示,或者一些让它工作的方法。他们的论坛似乎真的很陈腐。我在网上找到的大多数答案都没有答案。 任何帮助都将不胜感激。

  • 或者更好的方法是遍历它,为参数的每个索引获取TRUE或FALSE标志 我只知道如何使用matcher.find()进行循环,如果有任何帮助,我将不胜感激