现在我有两个单独的正则表达式来过滤字符串中的数据,但我很好奇是否有一种方法可以一次性完成所有操作。
样本数据:(数据$ 0 $ 34.0002,5.3114 34.0002美元,34.0004美元,5.2925 5.3214 34.0007美元,34.0002美元,2.2527 44.3604 34.0002美元,34.0004美元,43.689 38.3179 34.0007美元,8.1299)
- 需要验证是否有一个左括号和右括号()
- 需要验证是否有"DATA$0"在左括号 之后
- 需要按$ 拆分结果
- 需要用逗号分隔子集
- 只需要捕获该子集的最后一项(即5.3114、5.2925、5.3214等)
我的第一个检查是使用括号(([^)]+))作为我的RegEx w/righttolleft &ExplicitCapture选项(有些行可以有多个数据集)。
接下来我使用(?:(DATA$0)
筛选DATA$0最后我做我的分割,并采取最后一个值在数组中得到我需要的,但我试图找出是否有一个更好的方法。
string DataPattern = @"(?:(DATA$0)";
string ParenthesisPattern = @"(([^)]+))";
RegexOptions options = RegexOptions.RightToLeft | RegexOptions.ExplicitCapture;
StreamReader sr = new StreamReader(FilePath);
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
Console.WriteLine(line);
Match parentMatch = Regex.Match(line, ParenthesisPattern, options);
if (parentMatch.Success)
{
string value = parentMatch.Value;
Match dataMatch = Regex.Match(value, DataPattern);
if (dataMatch.Success)
{
string output = parentMatch.Value.Replace("(DATA$0", "").Replace(")", "");
string[] splitOutput = Regex.Split(output, @"$");
foreach (string x in splitOutput)
{
if (!string.IsNullOrEmpty(x))
{
string[] splitDollar = Regex.Split(x, ",");
if (splitDollar.Length > 0)
Console.WriteLine("Value: " + splitDollar[splitDollar.Length - 1]);
}
}
}
else
Console.WriteLine("NO DATA");
}
else
Console.WriteLine("NO PARENTHESIS");
Console.ReadLine();
}
TIA
可以使用
var results = Regex.Matches(text, @"(?<=(DATA$0[^()]*,)[^(),$]+(?=(?:$[^()]*)?))")
.Cast<Match>()
.Select(x => x.Value)
.ToList();
参见regex演示。细节:
(?<=(DATA$0[^()]*,)
-后面的正面查找,匹配紧接在(DATA$0
前面的位置,(
和)
以外的零个或多个字符(尽可能多)和逗号[^(),$]+
-除(
,)
,$
和逗号以外的一个或多个字符(?=(?:$[^()]*)?))
-当前位置必须紧随$
字符,然后是(
和)
以外的零个或多个字符,然后是)
字符。
的另一种选择:
var results = Regex.Matches(text, @"(?:G(?!^)|(DATA$0)[^()]*?,([^(),$]+)(?=(?:$[^()]*)?))")
.Cast<Match>()
.Select(x => x.Groups[1].Value)
.ToList();
参见regex演示。细节:
(?:G(?!^)|(DATA$0)
-前一个成功匹配的结束,或(DATA$0
字符串[^()]*?
-除(
,)
,,
以外的0个或多个字符,尽可能少,
-逗号([^(),$]+)
-第1组:除(
,)
,,
,$
以外的一个或多个字符(?=(?:$[^()]*)?))
-一个正向前看匹配的位置,紧跟着一个$
字符,后跟一个(
和)
以外的零或多个字符,然后是一个)
字符。