我制作了这个正则表达式,但它无效。
我有这个示例字符串: (' /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上尝试了我的正则表达式,正则表达式在这个网站上运行。
答案 0 :(得分:2)
你需要逃避点,否则它匹配任何字符
您的示例字符串包含大写字母,但您的正则表达式只接受小写字母
(编辑:不需要引用)
答案 1 :(得分:1)
您的示例在regex101中无法使用您提供的字符串,原因如下:
这个正则表达式可以解决问题(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")'
您不需要(也不想)使用正则表达式。