1

我正在尝试匹配任何以开头/John/但不包含/之后的字符串/John/

if

  [ $string == /John/[!/]+ ]; then  ....

fi

这就是我得到的,它似乎不起作用。

所以我尝试了

if

  [[ $string =~ ^/John/[!/]+$ ]]; then  ....

fi

它仍然不起作用,所以我将其更改为

if

  [[ $string =~ /John/[^/] ]]; then  ....

fi

它有效,但也会与/后面的所有字符串匹配/John/

4

4 回答 4

0

“字符串以'/John/'开头并且在'/John/'之后不包含任何斜杠”怎么样?

[[ $string = /John/* && $string != /John/*/* ]]

或者您可以与仅在满足条件时扩展的参数扩展进行比较。这表示“在剥离所有内容(包括最后一个斜杠)之后,字符串是 /John”:

[[ ${string%/*} = /John ]]

事实上,这最后一个解决方案是我唯一能想到的完全 POSIXLY_STRICT 的解决方案,无需多个test表达式。

[ "${string%/*}" = /John ]

顺便说一句,您的问题可能只是在单括号test表达式中使用双等号。bash 实际上确实在括号测试表达式中接受它们,但是单个等于是更好的主意。

于 2013-10-21T01:34:36.737 回答
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
于 2013-10-21T19:17:53.733 回答
0

对于您想要的 bash [[ $string =~ /John/[^/]*$ ]]- 行尾锚确保在最后一个可接受的斜杠之后没有斜杠。

于 2013-10-21T00:21:14.623 回答
-1

不确定您使用的是什么语言,但正常的否定字符类以 ^ 为前缀

例如

[^/]

您还可以放入开始/结束限定符(clojure 示例,Java 的正则表达式引擎)。通常 ^ 开头, $ 结尾。

user => (re-matches #"^/[a-zA-Z]+[^/]$" "/John/")
nil
于 2013-10-20T23:17:14.033 回答