求一个正则表达式分组

yayiba2020 2011-08-05 10:14:11
有这样子的字符串:
168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8
2 49 69 48 48 48 48 48 56 52 53 49 3 77
2 49 69 48 48 48 48 48 65 66 54 53 3 69
168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8
2 49 69 48 48 48 48 48 65 66 54 53 3 69
我想以"168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8"进行分组匹配,想要拆分为以下5个字符串:

"168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8"
"2 49 69 48 48 48 48 48 56 52 53 49 3 77"
"2 49 69 48 48 48 48 48 65 66 54 53 3 69"
"168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8"
"2 49 69 48 48 48 48 48 65 66 54 53 3 69"
...全文
168 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
silent_hanx 2011-08-05
  • 打赏
  • 举报
回复
总的Match:
(?<OUT>168\s129(\s\d+){11}\s48\s49\s53\s48\s1\s0\s\d+\s)(?<IN>(2\s(\d+\s){3}48\s(\d+\s){7}3\s\d+\s)+)

然后把IN的提出来再用2\s(\d+\s){3}48\s(\d+\s){7}3\s\d+过滤一次吧
icansaymyabc 2011-08-05
  • 打赏
  • 举报
回复
        static void Main()
{
string p1 = @"(?<head>168\s129(?:\s\d+){15}\s1\s0\s\d+)", p2 = @"(?<data>\b2(?:\s\d+){2}\s48(?:\s\d+)+?\s3\s\d+)", p3 = string.Format(@"(?<block>{0}(?:\s{1})+)", p1, p2);
Regex r1 = new Regex(p1), r2 = new Regex(p2), r3 = new Regex(p3);


string str = "168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8 2 49 69 48 48 48 48 48 56 52 53 49 3 77 2 49 69 48 48 48 48 48 65 66 54 53 3 69 168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8 2 49 69 48 48 48 48 48 65 66 54 53 3 69";

foreach( Match m in r3.Matches(str)){
string h = m.Groups["head"].Value ; //获取数据块头部
Console.WriteLine("==Head: " + h);
if (true) //这里假设头部验证通过
{

foreach( Capture c in m.Groups ["data"].Captures ){
Console.WriteLine(" +Data: "+c.Value);
}

}
}
}
huangwenquan123 2011-08-05
  • 打赏
  • 举报
回复

//如果里层数据和外层数据都是固定那样的话这样更简单
Regex reg = new Regex(@"((168(?:(?!\b2\b).)*)(2(?:(?!\b3\b).)*3\s\d+\s?)*)*");
foreach (Match m in reg.Matches(str))
{
foreach (Capture c in m.Groups[2].Captures)
Console.WriteLine(c.Value);
foreach (Capture c in m.Groups[3].Captures)
Console.WriteLine(c.Value);
}
Console.ReadLine();
/*
168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8
168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8
2 49 69 48 48 48 48 48 56 52 53 49 3 77
2 49 69 48 48 48 48 48 65 66 54 53 3 69
2 49 69 48 48 48 48 48 65 66 54 53 3 69

*/

yayiba2020 2011-08-05
  • 打赏
  • 举报
回复
恩,好的,非常感谢!谢谢各位了!
huangwenquan123 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yayiba2020 的回复:]
非常感谢!!但我还想了解下,我这个用正则分组的方式好不好实现。。我以前一直想用正则分组后用group取里层的数据,一直没分出来。。。
[/Quote]如果里层的数据都是固定那种形式的话可以用分组,然后用Capture取
yayiba2020 2011-08-05
  • 打赏
  • 举报
回复
非常感谢!!但我还想了解下,我这个用正则分组的方式好不好实现。。我以前一直想用正则分组后用group取里层的数据,一直没分出来。。。
huangwenquan123 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yayiba2020 的回复:]
恩,你的思路很对,如果多个外层数据匹配可以用一个数组来记录匹配成功的外层数据再遍历外层数据数组进行分割得到里层的数据。
[/Quote]
//取出外层,对所有外层数据进行分割

string str = @"168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8 2 49 69 48 48 48 48 48 56 52 53 49 3 77 2 49 69 48 48 48 48 48 65 66 54 53 3 69 168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8 2 49 69 48 48 48 48 48 65 66 54 53 3 69";
Regex reg = new Regex(@"168(?:(?!\b2\b).)*");
MatchCollection match = reg.Matches(str);
string[] first = new string[match.Count];
for (int i = 0; i < match.Count; i++)
{
first[i] = match[i].ToString();
Console.WriteLine(match[i]);
}
string result = string.Join(" ", str.Split(first, StringSplitOptions.RemoveEmptyEntries));
reg = new Regex(@"2(?:(?!\b3\b).)*3\s\d+\s?");
foreach (Match m in reg.Matches(result))
Console.WriteLine(m.Value);
Console.ReadLine();
yayiba2020 2011-08-05
  • 打赏
  • 举报
回复
恩,你的思路很对,如果多个外层数据匹配可以用一个数组来记录匹配成功的外层数据再遍历外层数据数组进行分割得到里层的数据。
huangwenquan123 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yayiba2020 的回复:]
不太符合要求,因为匹配成功的字符串还要再转换为数字进行校验,外层校验成功后再去取里层的数据。
所以我需要以分组的方式得到外层数据之间的里层数据。
[/Quote]10不是得到了吗?先得到外层的数据,在根据外层的数据进行分割获取每个外层之间的里层
yayiba2020 2011-08-05
  • 打赏
  • 举报
回复
不太符合要求,因为匹配成功的字符串还要再转换为数字进行校验,外层校验成功后再去取里层的数据。
所以我需要以分组的方式得到外层数据之间的里层数据。

huangwenquan123 2011-08-05
  • 打赏
  • 举报
回复
            string str = @"168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8 2 49 69 48 48 48 48 48 56 52 53 49 3 77 2 49 69 48 48 48 48 48 65 66 54 53 3 69 168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8 2 49 69 48 48 48 48 48 65 66 54 53 3 69";
Regex reg = new Regex(@"168(?:(?!\b2\b).)*");
string first = string.Empty;
foreach (Match m in reg.Matches(str))
{
first = m.Value;
Console.WriteLine(first);
}
string result = string.Join(" ", str.Split(new string[] { first }, StringSplitOptions.RemoveEmptyEntries));
reg = new Regex(@"2(?:(?!\b3\b).)*3\s\d+\s?");
foreach (Match m in reg.Matches(result))
Console.WriteLine(m.Value);
Console.ReadLine();
/*
168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8
168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8
2 49 69 48 48 48 48 48 56 52 53 49 3 77
2 49 69 48 48 48 48 48 65 66 54 53 3 69
2 49 69 48 48 48 48 48 65 66 54 53 3 69

*/
silent_hanx 2011-08-05
  • 打赏
  • 举报
回复
2\s(\d+\s){3}48\s(\d+\s){7}3\s\d+
这个是匹配(以2开头,第四位数字是48倒数第二位是3)这个格式的

然后把你上面那个合并在一起就是
168\s129(\s\d+){11}\s48\s49\s53\s48\s1\s0\s\d+\s|2\s(\d+\s){3}48\s(\d+\s){7}3\s\d+

你试试看合不合要求
q107770540 2011-08-05
  • 打赏
  • 举报
回复

void Main()
{
string str="168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8 2 49 69 48 48 48 48 48 56 52 53 49 3 77 2 49 69 48 48 48 48 48 65 66 54 53 3 69 168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8 2 49 69 48 48 48 48 48 65 66 54 53 3 69";
string[] s=Regex.Split(str,@"(168\s129(?:\s\d+){11}\s48\s49\s53\s48\s1\s0\s\d+\s)");
Console.WriteLine(s);
}

yayiba2020 2011-08-05
  • 打赏
  • 举报
回复
是这个168\s129(\s\d+){11}\s48\s49\s53\s48\s1\s0\s\d+\s
yayiba2020 2011-08-05
  • 打赏
  • 举报
回复
现在外层的正则表达式我写了能匹配出来,但我不知道怎么用正则分组得到里层的数据,请指教
168\s129(\s\d+){11}\s48\s49\s53\s48\s1\s0\s\d+\s(2\s\d+\s\d+\s
yayiba2020 2011-08-05
  • 打赏
  • 举报
回复
不好意思,我刚刚说得有问题,这个字符串是没有换行的,字符串原本是这样的
"168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8 2 49 69 48 48 48 48 48 56 52 53 49 3 77 2 49 69 48 48 48 48 48 65 66 54 53 3 69 168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8 2 49 69 48 48 48 48 48 65 66 54 53 3 69"

"168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8"这一段是外层的数据,
"2 49 69 48 48 48 48 48 56 52 53 49 3 77"(以2开头,第四位数字是48倒数第二位是3)这一段是里层的数据,这些数据我都要得到并做校验,我现在的思路是先用正则匹配出外层的数据,再得到里层的数据,然后用正则匹配里层的数据。

所以想要的输出结果是这样的
"168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8"
"2 49 69 48 48 48 48 48 56 52 53 49 3 77"
"2 49 69 48 48 48 48 48 65 66 54 53 3 69"
"168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8"
"2 49 69 48 48 48 48 48 65 66 54 53 3 69"
huangwenquan123 2011-08-05
  • 打赏
  • 举报
回复
            string str = @"168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8  
2 49 69 48 48 48 48 48 56 52 53 49 3 77
2 49 69 48 48 48 48 48 65 66 54 53 3 69
168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8
2 49 69 48 48 48 48 48 65 66 54 53 3 69 ";
string[] result = str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string s in result)
{
Console.WriteLine(s);
}
Console.ReadLine();
挨踢直男 2011-08-05
  • 打赏
  • 举报
回复
        string str = @"168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8 
2 49 69 48 48 48 48 48 56 52 53 49 3 77
2 49 69 48 48 48 48 48 65 66 54 53 3 69
168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8
2 49 69 48 48 48 48 48 65 66 54 53 3 69 ";
Regex regex = new Regex("^.*$", RegexOptions.Multiline);
Match mc = regex.Match(str);
while (mc.Success)
{
Response.Write(mc.Value + "<br/>");
mc = mc.NextMatch();
}


这个意思?多行匹配吗?
q107770540 2011-08-05
  • 打赏
  • 举报
回复
如果你真想得到5组数据 那就应该以换行符作为分组条件才是
q107770540 2011-08-05
  • 打赏
  • 举报
回复
不明白你的意思
如果是以 168 129 48 48 48 48 48 48 48 48 53 49 50 48 49 53 48 1 0 8 进行split分组
得到的 怎么会是5组数据?

"2 49 69 48 48 48 48 48 56 52 53 49 3 77"
"2 49 69 48 48 48 48 48 65 66 54 53 3 69"
这两条应该算一条数据才是

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧