我有这段代码:
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'和问号?
答案 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循环中)。