正则表达式在问号之前匹配文字

时间:2014-05-07 20:15:52

标签: c# regex

我有这段代码:

        string source = @"looking for goodid\?=11 and badid\?=01 other text";
        string searchTag = @"goodid\?=[\d]*";

        while (Regex.IsMatch(source, searchTag))
        {
            Console.WriteLine("found match!");
        }

我想找到'goodid'之后的id?而不是'badid'之后的那个,所以返回应该是11而不是01。

除非我删除问号“goodid”之前的搜索标签中的文字,否则找不到匹配项。如何在搜索旁边加上'goodid'和问号?

4 个答案:

答案 0 :(得分:2)

这里的问题似乎是源字符串@"\?"被解释为2个字符,而正则表达式@"\?"将匹配单个问号。发生这种情况是因为正则表达式?是一个特殊字符,需要进行转义。如果你想匹配两个字符@"\?",那么正则表达式将看起来像@"goodid\\\?=[\d]*";

也就是说,命名组有一个更简单的解决方案。

Match m = Regex.Match(source, @"goodid\\\?=(<id>?\d*)");

if(m.Success)
{
    Console.WriteLine("Match Found: " + m.Groups["id"].Value);
}

答案 1 :(得分:1)

改进

include/reader

答案 2 :(得分:0)

这个小正则表达式

(?<=goodid\\\?=)\d+

它使用lookbehind检查goodid\?=

的数字后面

在C#中它看起来像

string resultString = null;
try {
    resultString = Regex.Match(yourstring, @"(?<=goodid\\\?=)\d+", RegexOptions.Multiline).Value;
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

答案 3 :(得分:0)

我认为你的源字符串中有一个冗余的'\',这就是问题所在。如果您更改为:

string source = @"looking for goodid?=11 and badid\?=01 other text";

(删除问号前的反斜杠)
然后找到匹配(无限次!因为它在while循环中)。