解析ASCII数据的正则表达式



现在我有两个单独的正则表达式来过滤字符串中的数据,但我很好奇是否有一种方法可以一次性完成所有操作。

样本数据:(数据$ 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)

  1. 需要验证是否有一个左括号和右括号()
  2. 需要验证是否有"DATA$0"在左括号
  3. 之后
  4. 需要按$
  5. 拆分结果
  6. 需要用逗号分隔子集
  7. 只需要捕获该子集的最后一项(即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组:除(,),,,$以外的一个或多个字符
  • (?=(?:$[^()]*)?))-一个正向前看匹配的位置,紧跟着一个$字符,后跟一个()以外的零或多个字符,然后是一个)字符。

最新更新