我想为以下场景创建正则表达式:
如果字符串包含百分比字符(%
),则它只能包含以下内容:%20
,并且不能在其他“%
”之后。
因此,如果有%25
,它将被拒绝。例如,以下字符串有效:
http://www.test.com/?&Name=My%20Name%20Is%20Vader
但这些都会失败:
http://www.test.com/?&Name=My%20Name%20Is%20VadersAccountant%25
%%%25
非常感谢任何帮助,
凯尔
编辑:
简而言之,方案是将链接写入编码状态,然后通过JavaScript启动。没有解码工作。我尝试过.net解码和JS解码,每个都有相同的结果 - 结果在执行时保持编码状态。
答案 0 :(得分:5)
不需要%:
/^[^%]*(%20[^%]*)*$/
答案 1 :(得分:2)
您使用的是哪种语言?
大多数语言都有Uri编码器/解码器功能或类。 我建议你首先解码字符串,然后检查有效(或无效)的字符。
即。类似/ [\ w] /(空是一个空格)
首先使用正则表达式,您需要尊重www.example.com/index.html?user=admin&pass=%%250表示该传递确实是“%250”。
答案 2 :(得分:1)
我认为这会找到你需要的东西
/^([^%]|%%|%20)+$/
编辑:添加了%%
是URI中有效字符串的情况
Edit2 :并修复它应该失败的情况:-)
EDIT3 :
如果您需要在编辑器中使用它(这可以解释为什么您不能使用更多编程方式),那么您必须正确地转义所有特殊字符,例如在Vim中正则表达式应该松开:
/^\([^%]\|%%\|%20\)\+$/
答案 3 :(得分:1)
如果环顾四周无法获得另一种解决方案:
^([^%]|%([013-9a-fA-F][0-9a-fA-F]|2[1-9a-fA-F]))*$
答案 4 :(得分:1)
如果匹配%[^2][^0]
答案 5 :(得分:0)
在解码该字符串后,或许更好的方法是处理该验证:
string name = HttpUtility.UrlDecode(Request.QueryString["Name"]);
答案 6 :(得分:0)
我同意dominic对这个问题的评论。不要使用正则表达式。
如果你想避免两次扫描字符串,你可以只是迭代地搜索%
,然后检查它是否被20
跟着,没有别的。 (更新:允许将%
解释为文字%nnn
序列)
// pseudo code
pos = 0
while (pos = mystring.find(pos, '%'))
{
if mystring[pos+1] = "%" then
pos = pos + 2 // ok, this is a literal, skip ahead
else if mystring.substring(pos,2) != "20"
return false; // string is invalid
end if
}
return true;
答案 7 :(得分:0)
/^([^%]|%20)*$/
答案 8 :(得分:0)
这需要针对“坏”模式进行测试。如果我们允许%20
- 我们不需要确保它存在。
正如其他人之前所说,%%也是有效的......而%%25
将是%25
以下正则表达式匹配任何不符合上述规则的内容
/(?<![^%]%)%(?!(20|%))/
第一个括号检查字符前面是否有%(表示它是%%
)并检查它是否为%%%
。然后检查%,并检查后面的项目是否与20
这意味着如果正则表达式识别出任何内容,那么您应该拒绝它。