bash为什么我的正则表达式不起作用?

时间:2015-10-15 14:02:45

标签: regex bash

我制作了这个正则表达式,但它无效。

我有这个示例字符串: (' /test/test/test/test-Test/TEST/test.sql'),

我的bash代码:

if [[ ${arrayQuery[$i]} =~ ([a-z0-9]+)\/([a-z0-9]+)\/([a-z0-9]+)\/([a-z0-9-]+)\/([a-z0-9]+)\/([a-z0-9]+).([a-z0-9]+) ]]; then
        queryName=$1
        echo "test $queryName"
fi

没有任何人可以解释我为什么这不起作用?

我在regex101.com上尝试了我的正则表达式,正则表达式在这个网站上运行。

5 个答案:

答案 0 :(得分:2)

  • 你需要逃避点,否则它匹配任何字符

  • 您的示例字符串包含大写字母,但您的正则表达式只接受小写字母

(编辑:不需要引用)

答案 1 :(得分:1)

您的示例在regex101中无法使用您提供的字符串,原因如下:

  1. 你的字符串以'/'开头,但你的正则表达式以([a-z0-9] +)
  2. 开头
  3. 您的字符串包含大写字母但您在正则表达式中不使用[A-Z]
  4. 您的字符串包含' - ',但您的正则表达式不解析它,请尝试添加\ -
  5. 你没有逃脱点替换它''。',默认情况下'。'意味着所有人物
  6. 这个正则表达式可以解决问题(link to regex101):

    \/[a-zA-Z0-9\-]+\/[a-zA-Z0-9\-]+\/[a-zA-Z0-9\-]+\/[a-zA-Z0-9\-]+\/[a-zA-Z0-9\-]+\/[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-]+
    

    我猜这个字符串代表你硬盘中的一个SQL文件,这个正则表达式可以简化为:

    (\/[a-zA-Z0-9\-]+)+\.sql
    

    并且不依赖于目录树中有多少个文件夹。

答案 2 :(得分:0)

如果您向所有字符集添加A-Z(大写字母),它应该有效。

答案 3 :(得分:0)

您可以使用[[:alnum:]]作为(正确)类[a-zA-Z0-9]的捷径,以便在修复时简化正则表达式。更简单的是使用参数来缩短它:

x='[[:alnum:]]+'
# Or, if you prefer
# x='[a-zA-Z0-9]+'
if [[ ${arrayQuery[$i]} =~ ($x)/($x)/($x)/($x)/($x)/($x)\.($x) ]]; then
    queryName=$1
    echo "test $queryName"
fi

还有一个选项可以使正则表达式匹配不区分大小写,这将允许您使用当前的正则表达式(带有一些小修复):

shopt -s nocasematch
if [[ ${arrayQuery[$i]} =~ ([a-z0-9]+)/([a-z0-9]+)/([a-z0-9]+)/([a-z0-9-]+)/([a-z0-9]+)/([a-z0-9]+)\.([a-z0-9]+) ]]; then
    queryName=$1
    echo "test $queryName"
fi
shopt -u nocasematch  # Turn it off again

答案 4 :(得分:0)

从您的评论中,您似乎希望将路径拆分为其组件。在Bash中,最好的选择是使用它:

mypath=/testa/testb/testc/test-Testd/TESTe/test.sql
IFS=/ read -r -d '' -a components < <(printf '%s\0' "$mypath")

就像这样,你将拥有一个数组 components,它将包含你路径的每个组成部分:

gniourf$ declare -p components
declare -a components='([0]="" [1]="testa" [2]="testb" [3]="testc" [4]="test-Testd" [5]="TESTe" [6]="test.sql")'

您不需要(也不想)使用正则表达式。

另请参阅此问题:How do I split a string on a delimiter in Bash?