我试图实施两个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;
}
答案 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
。