2011-01-10 39 views
0
CriteriaCondition={FieldName=**{**EPS**}**$MinValue=(-201)$MaxValue=(304)$TradingPeriod=(-1)} 

帮助我获得与第一字“= {” &获得下一以下字与结束“}”结束的第一个字。帮我用正则表达式分割字符串

的结果必然是:

Word1 = "CriteriaCondition" 
Word2 = "FieldName={EPS}$MinValue=(-201)$MaxValue=(304)$TradingPeriod=(-1)" 

而且带有字符串 “字段名=(EPS)$ MINVALUE =( - 201)$的MaxValue =(304)$ TradingPeriod =( - 1)”,帮我分裂到对:

字段名EPS

MINVALUE -201

的MaxValue 304

TradingPeriod -1

谢谢。

+0

我不知道你可以用正则表达式干净地做到这一点。除非第二个匹配总是在字符串结尾附近结束。 – 2011-01-10 10:55:45

+0

第三次有`FieldName =(EPS)`。你期待多少嵌套?你会在你的值中使用`=`或`$`符号吗?这是整个弦还是它是一个更大弦的一部分? – Kobi 2011-01-10 11:07:37

回答

1

这看起来像.NET captures的工作。与许多其他正则表达式相比,.NET记得重复捕获组的所有捕获,而不仅仅是最后一个捕获组。我没有在这里安装VS,所以我不能测试这个,但尝试以下内容:

Match match = Regex.Match(subjectString, 
    @"(.*?)  # Match any number of characters and capture them 
    =\{   # Match ={ 
    (   # Match and capture the following group: 
    (?:  # One or more occurences of the following: 
     (?>[^$]+) # One or more characters except $, match possessively and capture 
     \$?  # Match the delimiting $ (optionally, because it's not there after the last item) 
    )+   # End of repeating group 
    )   # End of capturing group 
    \}   # Match } 
    ", 
    RegexOptions.IgnorePatternWhitespace); 
Console.WriteLine("Matched text: {0}", match.Value); 
Console.WriteLine("Word1 = \"{0}\"", match.Groups[1].Value); 
Console.WriteLine("Word2 = \"{0}\"", match.Groups[2].Value);  
captureCtr = 0; 
foreach (Capture capture in match.Groups[3].Captures) { 
    Console.WriteLine("  Capture {0}: {1}", 
          captureCtr, capture.Value); 
    captureCtr++; 
} 
1

为第一分割的正则表达式是: ^([^ =] +)= {(。*)} $

它containts: - 线 的开始 - 任何字符的第一组不同的=(字1) - 字符= { - 所述串的剩余(字2) - 字符} - 线的端

然后就可以字2分割成由字符$分离的部件,并施加类似的正则表达式(没有{和})到每个部分

0

此正则表达式将让你最有方式(让你在使用named capture groups

@"(?<criteria>[^=]+)\=\{((?<params>[^$]+)(\$|}))+" 

然而得到的东西,保持你有兴趣,我想了很多的字符串你不中的信息实际上并不关心,所以最好彻底摆脱它,然后从那里解析字符串。

沿着这些线路

东西会约你要完成(如果你需要回去并进行更改)到底是什么非常明确:

var temp = "CriteriaCondition={FieldName=**{**EPS**}**$MinValue=(-201)$MaxValue=(304)$TradingPeriod=(-1)}"; 

var startToken = "={"; 
var paramString = temp.Substring(temp.IndexOf(startToken) + startToken.Length); 
var cleanParamString = Regex.Replace(paramString, @"[*{}()]", ""); 

var parameters = cleanParamString.Split('$'); 

会给你用一个字符串数组以下行

FieldName=EPS 
MinValue=-201 
MaxValue=304 
TradingPeriod=-1 

并且您可以从那里更容易地操作它们。