日期:2014-05-16  浏览次数:21099 次

正则表达式提取值出现了异常,求解决(分很多,可以散)
本帖最后由 ershui 于 2014-03-13 20:54:01 编辑

//GetContents()功能是取得在str中,出现在 s 和e中间的内容,返回多个匹配结果
public static MatchCollection GetContents(string str, string s, string e)
{
            Regex rg = new Regex("(?<=(" + s + "))[.\\s\\S]*?(?=(" + e + "))", RegexOptions.Multiline | RegexOptions.Singleline);
            return rg.Matches(str);
 }

static void Main(string[] args)
{
          string str = "  aaa  没意义的话\r\n  无所谓\r\n bbb 第一个要取的目标 MMM 乱塞的 \r\n 随便什么 ccc 输什么都行 \r\n 无论啦 \r\n 真的无所谓 bbb 奇怪这个为什么会取到 MMM 乱来的 \r\n 干扰的 aaa 无所谓的文字 \r\n 随便了 \r\n 没有也行 bbb 第二个要取的目标 MMM";
          MatchCollection mc = GetContents(str, "aaa[.\\s\\S]*?bbb", "MMM");
           for (int i = 0; i < mc.Count; i++)
            {
                Console.WriteLine(mc[i].ToString());
                Console.WriteLine("--------------------------------------------------");
            }
            Console.ReadKey();
}


本来只想取到"第一个要取的目标"和" 第二个要取的目标"这两个字串,但中间多了一个貌似不匹配的"奇怪这个为什么会取到"
求高手解释,并帮我达到目的,谢谢
------解决方案--------------------
 string str = "  aaa  没意义的话\r\n  无所谓\r\n bbb 第一个要取的目标 MMM 乱塞的 \r\n 随便什么 ccc 输什么都行 \r\n 无论啦 \r\n 真的无所谓 bbb 奇怪这个为什么会取到 MMM 乱来的 \r\n 干扰的 aaa 无所谓的文字 \r\n 随便了 \r\n 没有也行 bbb 第二个要取的目标 MMM";
            foreach (Match m in Regex.Matches(str, @"(?<=aaa[^M]*?bbb\s+)[\s\S]*?(?=\s+MMM)"))
            {
                Console.WriteLine(m.Value);
            }

------解决方案--------------------
引用:
用的你的提醒,我采用Regex.Matches(str, @"(?<=aaa[^(bbb)]*?bbb)[\s\S]*?(?=MMM)")
达到了目的,但在进行html标签替换时还是没成功,我再试试,谢谢诸位,晚上来散分

你改成
MatchCollection mc = GetContents(str, "aaa(.(?!bbb))*?.bbb", "MMM");试试