请求正则表达式帮助

时间:2009-12-09 14:52:27

标签: c# regex

我有以下正则表达式:

var regex = @"\[(\w+)( (\w+)=""([^""]+)"")*\]";

此正则表达式匹配以下字符串:

[Name Parameter="Value" Parameter2="vv"]
[A B="3"]

所以,首先,我想扩展它以便它匹配字符串,如果值是一个字,那么你不需要在值之前/之后使用引号。例如:

[Name Parameter=OneWord]

我试过了:

var regex = @"\[(\w+)( (\w+)=([^""]+))*\]";

但它没有用,所以这是我的第一个问题。

我的第二个问题是,我想扩展它,如果有一个或多个空格,逗号,逗号和一个或多个空格,它也会匹配,但我不知道如何做到这一点。

示例:

[Name Parameter="SomeWord", p="v"       a=b,c=4 P1="2"]

有什么想法吗?

感谢。

5 个答案:

答案 0 :(得分:3)

不要害怕使用大量的空格和注释来使正则表达式具有可读性。

我继续编写了一个非常简单的解析器,它将读入一个字符串并将参数解析为字典以便于查找。

以下是完整的示例:

string inputSample = "[Name Parameter=\"SomeWord\", p=\"hello world\"       a=b,c=4 P1=\"2\"]";
var m = Regex.Match(inputSample, @"\[
                                        \s*(?<name>\w+)                            # capture the name
                                        (?<parameter>                              # start the parameters
                                            [\s,]*                                 # allow whitespace before a parameter
                                                (?<paramName>\w+)                  # capture the parameter name
                                                \s*                                # allow whitespace after a name
                                                =                                  
                                                \s*                                # allow whitespace before a value
                                                (                                  # a value can either be:
                                                    (?<paramValue>\w+)             # one whole word 
                                                    |                              # or
                                                    (""(?<paramValue>[^""]*)"")    # a quoted string
                                                )
                                        )*
                                   \]", RegexOptions.IgnorePatternWhitespace);

if(m.Success)
{
    string name = m.Groups["name"].Value;
    Dictionary<string, string> parameters = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
    int count = m.Groups["parameter"].Captures.Count;
    for(int i = 0; i < count; i++)
    {
        parameters[m.Groups["paramName"].Captures[i].Value] = m.Groups["paramValue"].Captures[i].Value;
    }

    string pValue = parameters["p"];
}

答案 1 :(得分:0)

这样做:

\[(\w+)([ \t]+(\w+)=(("([^""]+)")|([A-Za-z][A-Za-z0-9]*)))([, \t]+(\w+)=(("([^""]+)")|([A-Za-z][A-Za-z0-9]*)))*\]

答案 2 :(得分:0)

这就是你的正则表达式应该符合你的标准:

@"\[(\w+)\s*((\s*(\w+)\s*=\s*((""([^""]+)"")|(\w+))\s*),*)*\]"

编辑:要包含的新版本,(逗号)匹配...

答案 3 :(得分:0)

@"\[(\w+)((?:(?:\s+|,\s*)(?:\w+)\s*=\s*(?:""[^""]*""|[^""]+))*)]

将匹配您的示例,并允许引用字符串中的空格。但是,它会将所有参数捕获为一个大字符串。正则表达式不可能捕获它们自己的捕获组中的每个参数/值对,因此解析器确实可能是一个更好的主意。

答案 4 :(得分:0)

@"\[(\w+)(\s+(\w+)=(""([^""]+)""|\w+))*\]";