在c#上表示通配符

时间:2012-05-07 08:38:10

标签: c# regex oracle wildcard

我试图实施两个oracle通配符"%"和" _"在我的c#程序中使用Regex类。问题是我有通配符" _"因为我只需要接受一个字符,但每次我至少有一个字符时它会返回true。你能帮我吗?

这是我的代码:

string filter, string1;

string wildcard1 = "[" + "\\d | " + "\\n | " + "\\s |" + "\\w]+";
string wildcard2 = "[" + "\\d | " + "\\n |" + "\\s | " + "\\w]{1}";

filter = Regex.Replace(filter, "%", wildcard1);
filter = Regex.Replace(filter, "_", wildcard2);

Regex regex1 = new Regex(filter, RegexOptions.IgnoreCase);

MatchCollection a = regex1.Matches(string1);

if (regex1.IsMatch(string1))
{
    return true;
}

2 个答案:

答案 0 :(得分:5)

您必须进行以下两次转换:

  • %.*,表示“任何字符,任意次数”
  • _.,表示“任何字符(如果您未另行指定,则默认为一次)”

您还必须在开头添加^,在结尾添加$,以强制匹配整个字符串,而不是其中的一部分。

最后,这非常重要,你必须escape the original string。如果不这样做,正则表达式将处理任何特殊字符。即原始字符串中的点.将被解释为正则表达式中的“任何字符”。

例如,如果您有此SQL LIKE字符串:

  Hello, %, is your inital _?

您必须将其转换为:

  ^Hello, .*, is your inital .\?$

(这会匹配“Hello,John,你的初始J?”等字符串。)

首先,您必须将其转义,以便使用反斜杠?转义\和任何其他特殊字符。

然后替换%_并添加字符串字符的开头和结尾(^$)。

还要注意,您可以使用选项创建正则表达式,其中一个选项可让您指定它是否区分大小写。这也是模仿Oracle行为的必要条件。

最后,使用IsMatch(string)方法代替匹配。

答案 1 :(得分:0)

使用这样的正则表达式,如果任何子字符串匹配,您将获得匹配。因此,如果您要求abc_并且输入字符串为abcde,则它也将匹配,因为子字符串abcd匹配。使用^$包裹您的过滤器以避免这种情况。

除此之外,在构建正则表达式时进行初始替换,如下所示:

filter = Regex.Replace(filter, "%", wildcard1);
filter = Regex.Replace(filter, "_", wildcard2);
除非你确定你替换的字符不是正则表达式特殊字符,否则

会遇到麻烦。只需使用普通的字符串替换。

另外,您可以使用regex.IsMatch代替Matches