我有以下正则表达式:
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"]
有什么想法吗?
感谢。
答案 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+))*\]";