如何在c#regex中捕获匹配和不匹配?

时间:2012-07-21 19:58:04

标签: c# regex

我有一些格式的消息,例如:

"?I?Message message message\r\n"

现在我想通过正则表达式使用命名组来捕获此消息:

(?<Message>\?(?<Type>\S)\?(?<Text>[\S\s]+(\r\n)+))

但是我想拥有与此消息格式不匹配的所有字符串。例如:

"Some data?I?Message message\r\nAnother part of data\n"

会给我3场比赛:

  • “一些数据”
  • ?我?消息留言\ r \ n
  • “数据的另一部分\ n”

我可以检查消息组是否将Success字段设置为true以检查是否出现任何提到的格式的消息。否则我会得到一些“原始数据”。 是否可以使用正则表达式和匹配执行此类操作?

3 个答案:

答案 0 :(得分:0)

这是一种方法:

var str = "Some data?I?Message message\r\nAnother part of data\n";
var unmatchedCharIndices = Enumerable.Range(0, str.Length);
foreach (Match match in Regex.Matches(str, @"(?<Message>\?(?<Type>\S)\?(?<Text>[\S\s]+(\r\n)+))"))
{
    unmatchedCharIndices = unmatchedCharIndices.Except(Enumerable.Range(match.Index, match.Length));
    //do other stuff with match
}
var unmatchedStrings = unmatchedCharIndices
            .Select((n, i) => new { n, i })
            .GroupBy(x => x.n - x.i) //this line will group consecutive nums in the seq
            .Select(x => str.Substring(x.First().n, x.Count()));
foreach (var unmatchedString in unmatchedStrings)
{
    //do something with non-match text
}

unmatchedStrings代码感谢Getting last x consecutive items with LINQ开始)

答案 1 :(得分:0)

Regex.Match的结果对象属于Match类型。其Success属性显示正则表达式是否与匹配。

但是还有一个Groups属性,您可以使用该属性来查看个别(已命名或未命名)捕获组。如果命名捕获无法匹配,那么该组的Success属性将为false。

所以用

var m = Regex.Match("Fubar", "(?<x>Z)?.*");

然后

m.Success

是真的,但是

m.Groups['Z'].Success

是假的。

使用Regex.Matches正则表达式可以多次匹配,每个匹配将是返回的Match中的单个MatchCollection对象。 默认情况下,正则表达式会跳过不匹配的输入节,因此:

Regex.Matches("ZaZ", "Z")

将返回两个匹配的集合,但“a”没有任何内容。您可以使用\G锚点强制下一场比赛在上一场比赛之后立即开始。

答案 2 :(得分:0)

To match mismatches

string toSearchString = "your string here";

Match match = new Regex("*some pattern here*").Match(toSearchString );

string unmatchedString = toSearchString.Replace(match.Value,"");

所以现在你有了不匹配的字符串。你可以喝咖啡!!