[英]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.