1

我正在使用 C# 中的正则表达式来排除字符串中的某些模式。

这些是我想要接受的类型模式是:“%00”(十六进制 00-FF)和任何其他没有开始 '%' 的字符。我想排除的模式是:“%0”(以 % 开头,后面有一个字符的值)和/或字符“&<>'/”。

到目前为止我有这个

Regex correctStringRegex = new Regex(@"(%[0-9a-fA-F]{2})|[^%&<>'/]|(^(%.))", 
                                     RegexOptions.IgnoreCase);

以下是我试图通过和拒绝的示例。

传递字符串%02This is%0A%0Da string%03
拒绝字符串%0%0Z%A&<%0a%

如果一个字符串没有通过所有要求,我想完全拒绝整个字符串。

任何帮助将不胜感激!

4

2 回答 2

1

我建议这样做:

^(?:%[0-9a-f]{2}|[^%&<>'/])*$

解释:

^             # Start of string
(?:           # Match either
 %[0-9a-f]{2} # %xx
|             # or
 [^%&<>'/]    # any character except the forbidden ones
)*            # any number of times
$             # until end of string.

这确保%仅在后跟两个十六进制时才匹配。由于您已经在编译带有IgnoreCase标志集的正则表达式,因此您也不需要a-fA-F.

于 2012-08-02T16:14:48.497 回答
1

嗯,鉴于到目前为止的评论,我认为您需要一个不同的问题定义。您希望使用正则表达式根据字符串是否包含任何无效模式来传递或失败字符串。我假设如果存在任何无效模式,则字符串将失败,而不是如果存在任何有效模式,则字符串的反向传递。

因此,我会使用这个正则表达式:%(?![0-9a-f]{2})|[&<>'/]

然后,您将以这样的方式运行它,即如果您 GET 匹配,则字符串无效,有效的字符串在此集中将没有任何匹配项。

A quick explanation of a rather odd regex. The format (?!) tells the regex "Match the previous symbol if the symbols in this set DONT follow it" ie: Match if suffix not present. So, what im telling it to look for is any instance of % that is not followed by 2 hex characters, or any other invalid character. The assumption is that anything that DOESN'T match this regex is a valid character entry.

于 2012-08-02T18:03:12.463 回答