我正在尝试匹配以/John/
开头但在/
之后不包含/John/
的任何字符串
if
[ $string == /John/[!/]+ ]; then ....
fi
这就是我得到的,似乎没有用。
所以我试过
if
[[ $string =~ ^/John/[!/]+$ ]]; then ....
fi
它仍然无效,因此我将其更改为
if
[[ $string =~ /John/[^/] ]]; then ....
fi
虽然有效,但也会匹配/
后面/John/
所有字符串。
答案 0 :(得分:0)
对于bash,你想要[[ $string =~ /John/[^/]*$ ]]
- 行结束锚点确保在最后一个可接受的斜杠之后没有斜杠。
答案 1 :(得分:0)
“字符串以'/ John /'开头并且在'/ John /'之后不包含任何斜杠怎么样?”
[[ $string = /John/* && $string != /John/*/* ]]
或者您可以与仅在满足条件时展开的参数扩展进行比较。这说“在剥去一切之后,包括在最后一次斜线后,字符串是/ John”:
[[ ${string%/*} = /John ]]
事实上,最后一个解决方案是我唯一可以提出的POSIXLY_STRICT解决方案,没有多个test
表达式。
[ "${string%/*}" = /John ]
顺便说一下,你的问题可能只是在单括号test
表达式中使用双等号。 bash实际上确实在 double -bracket测试表达式中接受它们,但是单个等于是一个更好的主意。
答案 2 :(得分:0)
您也可以使用普通的旧grep:
string='/John Lennon/Yoko Ono'
if echo "$string" | grep -q "/John[^/]" ; then
echo "matched"
else
echo "no match found"
fi
只有当/ John位于字符串的最后时才会失败...如果有可能那么你可以调整来处理这种情况,例如:
string='/John Lennon/Yoko Ono'
if echo "$string" | grep -qP "(/John[^/])|(/John$)" ; then
echo "matched"
else
echo "no match found"
fi
答案 3 :(得分:-1)
不确定您使用的是哪种语言,但正常的否定字符类前缀为^
e.g。
[^/]
您还可以输入开始/结束限定符(clojure示例,因此Java的正则表达式引擎)。通常在开始时为^,在结束时为$。
user => (re-matches #"^/[a-zA-Z]+[^/]$" "/John/")
nil