【问题标题】:representing wildcards on c#在 c# 上表示通配符
【发布时间】:2012-05-15 18:45:32
【问题描述】:

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

【问题讨论】:

  • 我不确定我是否理解你..

标签: c# regex oracle wildcard


【解决方案1】:

你必须进行这两个转换:

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

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

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

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

  Hello, %, is your inital _?

您必须将其转换为:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 我将正则表达式更改为:string wildcard2 = "[\\d\\n\\s\\w]$ | ^[\\d\\n\\s\\w]" ;但它不起作用。你能帮帮我吗?
    • string filter = "^" + filter.Replace("_", "[your_regex_here]") + "$"。您的正则表达式可以是您使用的,或者只是.,它匹配任何字符。请发布您如何测试它的示例以及下次哪些字符串不起作用。
    • 这个解决方案适用于:string1="patolo cli patolo", filter="_pat"。它返回假。没错,但如果我将 string1 更改为“zpatolo cli patolo”,它会再次返回 false,它应该返回 true...
    猜你喜欢
    • 2019-05-12
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    相关资源
    最近更新 更多