繁体   English   中英

在c#上表示通配符

[英]representing wildcards on c#

我正在尝试使用Regex类在我的c#程序上实现两个oracle通配符“%”和“_”。 问题是当我有通配符“_”因为我只需要接受一个字符,但每次我至少有一个字符时它返回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;
}

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

  • % to .* ,表示“任何字符,任意次”
  • _. 这意味着“任何字符(如果您没有另外指定,则默认为一次)”

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

最后,这非常重要,你必须逃避原来的字符串 如果不这样做,正则表达式将处理任何特殊字符。 就是一个点. 在原始字符串中将在正则表达式中解释为“任何字符”。

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

  Hello, %, is your inital _?

你必须将其转换为:

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

(这将匹配像“你好,约翰,你的初始J?”这样的字符串)

首先,你必须逃避它,以便? 并使用反斜杠\\来转义任何其他特殊字符。

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

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

最后,使用IsMatch(string)方法而不是Match。

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

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

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

除非你确定你替换的字符不是正则表达式特殊字符,否则要求麻烦。 只需使用普通的字符串替换。

另外,您可以使用regex.IsMatch而不是Matches

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM