不用正则表达式.
====================
string s1="[**abc**]def[**abc2**]jjjjnjndfg";
s1=s1.Replace("**","");
string[] s2=s1.Split('[');
string[] s3;
for(int i=0;i<s2.Length;i++)
{
if(s2[i]!="")
{
s3=s2[i].Split(']');
Console.Out.WriteLine(s3[0]+":"+s3[1]);
}
}

解决方案 »

  1.   

    我感觉不太好,因为你把字符串"[**"和"**]"分隔起来处理,如果字符串中存在"**","[","]"的话是肯定会出错的。我的关键是取出字符串后怎么能把已处理过了一部分继续参加匹配。比如我可以通过@"\[\*\*(.*?)\*\*\](.*?)\[\*\*"来匹配出abc(在match.Group[1]中)和def(在match.Group[2]中),但由于"[**"作为match.Grout[2]的一部分已经参与了匹配,后面的字符串就只剩"abc2**]..."之后的部分了,再一次的循环时就只能匹配到下一个标题,中间会漏掉一个!有什么办法能让匹配过的一部分再次参加匹配?
    [**abc**]def
    [**abc2**]jjjj
    njndfg
    [****]
    [**abc**]kkkk
    [**abc2**]asdjfvs
    [**abc3**]fhshg
    [****]
      

  2.   

    using System;
    using System.Text.RegularExpressions;namespace Samples {
        public class RegExMatcherMulti {
            public static void Main(String[] args){
                Regex myRegex = new Regex("\\[\\*\\*(?<g1>.*)\\*\\*\\](?<g2>.*\\r\\n)");
                String s = @"[**abc**]def
    [**abc2**]jjjj
    njndfg
    [****]
    [**abc**]kkkk
    [**abc2**]asdjfvs
    [**abc3**]fhshg
    [****]";            MatchCollection mc = myRegex.Matches(s);            if ( mc.Count > 0 ) {
                    System.Console.WriteLine("Results:");
                    foreach (Match m in mc) {
                        System.Console.WriteLine(m.Groups["g1"].Value + " : " + m.Groups["g2"].Value);
                    }
                }            System.Console.WriteLine();
                System.Console.WriteLine("Press Enter to Continue...");
                System.Console.ReadLine();
            }
        }
    }
      

  3.   

    你匹配的是回车换行,但这样会丢失数据。
    举个例子:字符串中有
    “[**abc2**]jjjj
    njndfg”,里面也包含了一个回车换行,结果匹配出来后"jjjj"后面的部分就没有了,这不合理。
    最好是将内容部分的结束位置和"[**"匹配,但这样标题的开始部分又没有了,真麻烦。实在不行就只好要求标题必须有明确的结束标志。
      

  4.   

    这样的字符串:
    <编号>232</编号>
    <名称>asdf</名称>
    <**>
    <编号>234</编号>
    <名称>gsfh</名称>
    <说明>hhhjsfgadsf</说明>
    <**>
    又该怎么转成xml格式呢?
    我依旧不能弄成功。能匹配出所有标题和内容,但无法区分出不同的主题,就是用<**>分隔的。
      

  5.   

    try it again...
    string t="[**abc**]def[**abc2**]jjjjn [****][**abc**]kkkk[**abc2**]asdjfvs[**abc3**]fhshg[****]";
    Regex reg=new Regex(@"\*\*([^\[]*?)\[");
    foreach(Match m in reg.Matches(t))
    {
    a=m.Groups[1]+"\n";
    string[] s2=a.Split('**]');
    Console.Out.WriteLine(s2[0]+":"+s2[1]); }
      

  6.   

    这个就可以啦,不会因为回车引起问题。using System;
    using System.Text.RegularExpressions;namespace Samples {
        public class RegExMatcherMulti {
            public static void Main(String[] args){
                Regex myRegex = new Regex("(\\[\\*\\*|\\*\\*\\])(?<g1>[^(\\[\\*\\*|\\*\\*\\])]*)");
                String s = @"[**abc**]def
    [**abc2**]jjjj
    njndfg
    [****]
    [**abc**]kkkk
    [**abc2**]asdjfvs
    [**abc3**]fhshg
    [****]";            MatchCollection mc = myRegex.Matches(s);            if ( mc.Count > 0 ) {
                    System.Console.WriteLine("Results:");
                    foreach (Match m in mc) {
                        string x = m.Groups["g1"].Value;
                        System.Console.Write(x);
                        if (x.IndexOf("\r\n") < 0 && x.Trim() != "")
                        {
                         System.Console.Write(" : ");
                        
                     }
                    }
                }            System.Console.WriteLine();
                System.Console.WriteLine("Press Enter to Continue...");
                System.Console.ReadLine();
            }
        }
    }