1

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

"?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场比赛:

  • “一些数据”
  • ?I?消息消息\r\n
  • "另一部分数据\n"

我可以检查消息组是否将成功字段设置为 true,以检查是否出现任何上述格式的消息。否则我会得到一些“原始数据”。是否可以使用 regex 和 Matches 做这样的事情?

4

3 回答 3

0

To match mismatches

string toSearchString = "your string here";

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

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

所以现在你有了 Unmatched String。你可以喝咖啡!!

于 2014-12-11T17:51:46.937 回答
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代码感谢使用 LINQ 获取最后 x 个连续项目作为开始)

于 2012-07-21T20:19:44.907 回答
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您可以使用锚点强制下一场比赛在前一场比赛之后立即开始。

于 2012-07-21T20:27:26.277 回答