日期:2014-05-18  浏览次数:20868 次

逍遥请进~~正则
我一直有个疑问,两个字符之间,有可能出现换行,空格,不换行,或者表种字符的组合 这种要怎么写?
e.g.
<selection type="1" categ="0" parent_id="2" sel_id="3" 后面可能有更多>
我这么写
<?isn><selection[^>]*type[^>]*=[^>]*(?'type'\S*)[^>]*>
现在我是只想取type,有时候我想取 type 各 sel_id,但是=前后有可能有空格,也有可能没有,也有可能有换行,回车之类的,而且""也有可能是'',我怎么写都没写出来

------解决方案--------------------
C# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] data = { "aa", "a   a", "a a", @"a 
                                                    a", @"a
a", "a a", "a1a", "aaa" };
            Console.WriteLine(@"a\s+a Singleline vs Multiline");
            var result1 = data.Select((x, i) => i + ":  " + Regex.IsMatch(x, @"a\s+a", RegexOptions.Singleline).ToString());
            var result2 = data.Select((x, i) => i + ":  " + Regex.IsMatch(x, @"a\s+a", RegexOptions.Multiline).ToString());
            Console.WriteLine(string.Join("\r\n", result1.Zip(result2, (x, y) => x + "\t" + y)));
            Console.WriteLine(@"a.+a Singleline vs Multiline");
            result1 = data.Select((x, i) => i + ":  " + Regex.IsMatch(x, @"a.+a", RegexOptions.Singleline).ToString());
            result2 = data.Select((x, i) => i + ":  " + Regex.IsMatch(x, @"a.+a", RegexOptions.Multiline).ToString());
            Console.WriteLine(string.Join("\r\n", result1.Zip(result2, (x, y) => x + "\t" + y)));
        }
    }
}

------解决方案--------------------
探讨

引用:

try this
(?is)<selection[^>]*type\s*=\s*('|")(.*?)\1[^>]*sel_id\s*=\s*\1(.*?)\1[^>]*>

去第2个分组和第三个分组//1和3

多匹配出一业个” 能不能解释一下(.*?)\1 是什么意思?

------解决方案--------------------
Assembly code
(?isn)<selection\b\s+[^>]*type[^>=]*=("(?<type>[^"]+)"|(?<type>\S+))[^>]*?sel_id[^>=]*=("(?<sel_id>[^"]+)"|(?<sel_id>\S+))