使用Regex,如何找到2个字符之间的重复模式?

时间:2016-01-21 12:13:53

标签: c# regex

我如何使用正则表达式查找2个ASCII代码之间的任何内容? ASCII码STX(\ u0002)和ETX(\ u0003)

示例字符串"STX,T1,ETXSTX,1,1,1,1,1,1,ETXSTX,A,1,0,B,ERRETX"

在上面我的匹配上使用Regex应该是

,T1,
,1,1,1,1,1,1,
,A,1,0,B,ERR

做了一些谷歌搜索,我尝试了以下模式,但它没有找到任何东西。

@"^\u0002.*\u0003$"

更新:谢谢大家,下面的一些很好的答案似乎都有效!

3 个答案:

答案 0 :(得分:4)

您可以使用Regex.Split

var input = (char)2 + ",T1," + (char)3 + (char)2 + ",1,1,1,1,1,1," + (char)3 + (char)2 + ",A,1,0,B,ERR" + (char)3;
var result = Regex.Split(input, "\u0002|\u0003").Where(r => !String.IsNullOrEmpty(r));

答案 1 :(得分:2)

您也可以使用非正则表达式解决方案(基于Wyatt's answer):

var result = input.Split(new[] {'\u0002', '\u0003'}) // split with the known char delimiters
       .Where(p => !string.IsNullOrEmpty(p)) // Only take non-empty ones
       .ToList();

enter image description here

我在评论中建议的正则表达式解决方案:

var res = Regex.Matches(input, "(?s)\u0002(.*?)\u0003")
          .OfType<Match>()
          .Select(p => p.Groups[1].Value)
          .ToList();

答案 2 :(得分:2)

            var s = "STX,T1,ETXSTX,1,1,1,1,1,1,ETXSTX,A,1,0,B,ERRETX";
            s = s.Replace("STX", "\u0002");
            s = s.Replace("ETX", "\u0003");

            var result1 = Regex.Split(s, @"[\u0002\u0003]").Where(a => a != String.Empty).ToList();
            result1.ForEach(a=>Console.WriteLine(a));

            Console.WriteLine("------------ OR WITHOUT REGEX ---------------");

            var result2 = s.Split(new char[] { '\u0002','\u0003' }, StringSplitOptions.RemoveEmptyEntries).ToList();
            result2.ForEach(a => Console.WriteLine(a));

输出:

,T1,
,1,1,1,1,1,1,
,A,1,0,B,ERR
------------ OR WITHOUT REGEX ---------------
,T1,
,1,1,1,1,1,1,
,A,1,0,B,ERR