.net 在C中使用正则表达式搜索字符串#

.net 在C中使用正则表达式搜索字符串#,.net,regex,.net,Regex,我从HTTP请求返回了以下字符串 "keyverified=yes connected=no now=1347429501 debug=Not connected and no params"; 现在我想使用正则表达式提取不同的键值组合。我已经试过了 var regString = @"keyverified=([a-zA-Z0-9]+)"; var regex = new Regex(regString, RegexOptions.Singleline); v

我从HTTP请求返回了以下字符串

"keyverified=yes connected=no now=1347429501 debug=Not connected and no params";
现在我想使用正则表达式提取不同的键值组合。我已经试过了

var regString = @"keyverified=([a-zA-Z0-9]+)";
        var regex = new Regex(regString, RegexOptions.Singleline);
        var match = regex.Match(str);
        foreach (Group group in match.Groups)
        {
            Console.WriteLine(group.Value);
        }

对于
keyverified
connected
来说,它工作正常并给出相应的值,但当我将regString更改为
@“debug=([a-zA-Z0-9]+)”
时,它只给出第一个单词,即
而不是
。我想提取整个值,如
未连接和无参数。我该怎么做?

对于调试,您应该在正则表达式中添加空格:

@"debug=([a-zA-Z0-9\s]+)"
您可以用更简洁的方式编写:

@"debug=([\w\s]+)"
考虑一下,如果调试后有其他字段,那么字段名也将匹配
由于字段之间没有正确的分隔符。

假设键可能不包含空格或符号,并且值可能不包含符号,则可以执行以下操作:

Regex regexObj = new Regex(
    @"(?<key>  # Match and capture into group ""key"":
     [^\s=]+   # one or more non-space characters (also, = is not allowed)
    )          # End of group ""key""
    =          # Match =
    (?<value>  # Match and capture into group ""value"":
     [^=]+     # one or more characters except =
     (?=\s|$)  # Assert that the next character is a space or end-of-string
    )          # End of group ""value""", 
    RegexOptions.IgnorePatternWhitespace);
Match matchResult = regexObj.Match(subjectString);
while (matchResult.Success) {
    Console.WriteLine("Key: " + matchResult.Groups["key"].Value);
    Console.WriteLine("Value: " + matchResult.Groups["value"].Value);
    matchResult = matchResult.NextMatch();
} 
Regex regexObj=新的Regex(
@(?#匹配并捕获到组“键”:
[^\s=]+#一个或多个非空格字符(也不允许使用“=”)
)#组“”键“”的结尾
=#匹配=
(?#匹配并捕获到组“值”:
[^=]+#一个或多个字符,除了=
(?=\s |$)#断言下一个字符是空格或字符串结尾
)#组“值”的末尾,
RegexOptions.ignorepattern(空格);
Match matchResult=regexObj.Match(subjectString);
while(matchResult.Success){
Console.WriteLine(“键:+matchResult.Groups[“键”].Value);
Console.WriteLine(“值:”+matchResult.Groups[“值”].Value);
matchResult=matchResult.NextMatch();
} 
您可以尝试以下方法:


由于等号前面的项目不包含空格,因此可以使用“向前看”:

@"debug=([A-Za-z0-9\s]+)(?=((\s[A-Za-z0-9])+=|$))"

这就是我在最后一点上说的。如果debug是最后一个,那么它可以工作。Tim也提出了一个非常通用的解决方案,但它仍然只有在多字字段是最后一个字段时才起作用,这里的问题是输入格式。您是否看到与匹配相关的行被注释掉了?我不知道您是如何存储键/值对的,所以我将这部分留给您。所有键/值对都存在于示例字符串中。此外,我在测试regexNo之前删除了注释行,您需要取消注释并更改它们,以便将捕获的值存储在某个地方。我把它们改成了文字,希望你现在明白我的意思。