我有一些格式的消息,例如:
"?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场比赛:
我可以检查消息组是否将Success字段设置为true以检查是否出现任何提到的格式的消息。否则我会得到一些“原始数据”。 是否可以使用正则表达式和匹配执行此类操作?
答案 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,"");
所以现在你有了不匹配的字符串。你可以喝咖啡!!