4

我正在尝试使用 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;
}
4

2 回答 2

5

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

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

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

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

例如,如果你有这个 SQL LIKE 字符串:

  Hello, %, is your inital _?

您必须将其转换为:

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

(这将匹配诸如“Hello, John, is your initial J?”之类的字符串)

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

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

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

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

于 2012-05-07T09:28:10.397 回答
0

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

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

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

正在自找麻烦,除非您确保您替换的字符不是正则表达式特殊字符。只需为此使用普通字符串替换即可。

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

于 2012-05-07T08:51:29.773 回答