我在bash中有一个匹配和清理的字符串,例如:
POST_DATA="password=this*pass&is/for?testing"
我希望匹配=符号清理(不包括)此字符之后的所有字符串*& /?
我可以使用以下符号获取=符号后的所有内容:
[[ ${POST_DATA} =~ ^password=(.*)$ ]] && password="${BASH_REMATCH[1]}"
echo $password
这表明:
this*pass&is/for?testing
我想要一个所需输出的正则表达式:
thispassisfortesting
我尝试了一些排除那些没有这样工作的模式:
^password=(^[^\*\?&/])*$
有什么想法吗?感谢。
答案 0 :(得分:3)
使用参数扩展而不是正则表达式:
#!/bin/bash
POST_DATA="password=this*pass&is/for?testing"
after_eq=${POST_DATA#*=} # remove everything up to the first =
printf '%s\n' "${after_eq//[*&\/?]}" # remove all asterisks, ampersands, slashes and question marks
答案 1 :(得分:0)
使用perl:
% echo "$POST_DATA" | perl -pe 's/(?:password=|[*&\/?])//g'
thispassisfortesting
答案 2 :(得分:0)
这里的问题是正则表达式应该匹配某些东西。你写了一个模式,它既可以匹配某些东西,也可以不匹配。它不应该删除东西,只是为了匹配。
因此,您要做的是删除一些特定字符以清理字符串,这不是正则表达式的用例。 你需要的是某种String.replace(/ [^ * \?& /] /,“”),它将从你的字符串中删除所有违规字符。
假设您使用的是PHP(基于您使用的${POST_DATA}
),我建议您在匹配preg_replace('/[^\*\?&\/]/','',${POST_DATA})
之前使用:password=
,以便删除所有违规字符。< / p>