正则表达式 - 如果包含'%',则只能包含'%20'

时间:2009-12-02 09:32:58

标签: regex

我想为以下场景创建正则表达式:

如果字符串包含百分比字符(%),则它只能包含以下内容:%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解码,每个都有相同的结果 - 结果在执行时保持编码状态。

9 个答案:

答案 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

不匹配

这意味着如果正则表达式识别出任何内容,那么您应该拒绝它。