正则表达式使用C#从字符串中获取值

时间:2016-04-20 17:42:58

标签: c# .net regex string match

我之前发布过这篇文章,但没有提供我想要实现的内容的明确信息。

我正在尝试使用c#中的Regex从字符串中获取值。我无法理解为什么我可以得到一些值,有些我不能使用类似的方法。

请在下面找到代码段。 请让我知道我错过了什么。 提前谢谢。

string text = "0*MAO-001*20160409*20160408*Encounter Data Duplicates Report       *     *ENC000200800400120160407*PRO*PROD*";

//toget the value 20160409 from the above text
//this code works fine
Regex pattern = new Regex(@"([0][*]MAO[-][0][0][1].*?[*](?<Value>\d+)[*])");
Match match = pattern.Match(text);
string Value = match.Groups["Value"].Value.ToString();



//to get the value ENC000200800400120160407 from the above text
// this does not work and gives me nothing
Regex pattern2 = new Regex(@"([0][*]MAO[-][0][0][1].*?[*].*?[*].*?[*].*?[*].*?[*](?<Value2>\d+)[*])");
Match match2 = pattern.Match(text);
string Value2 = match.Groups["Value2"].Value.ToString();

4 个答案:

答案 0 :(得分:1)

看起来您的文件是'*'分隔符。

您可以使用一个正则表达式来捕获所有值

尝试使用

((?<values>[^\*]+)\*)

作为你的模式。

所有这些值都将在数值数组中捕获。

----更新添加c#代码-----

string text = "0*MAO-001*20160409*20160408*Encounter Data Duplicates Report       *     *ENC000200800400120160407*PRO*PROD*";
Regex pattern = new Regex(@"(?<values>[^\*]+)\*");
var matches = pattern.Matches(text);
string Value = matches[3].Groups["values"].Captures[0];
string Value2 = matches[6].Groups["values"].Captures[0];

答案 1 :(得分:0)

在您第二次尝试使用正则表达式时,您与pattern而不是pattern2匹配。

Match match2 = pattern.Match(text);
string Value2 = match.Groups["Value2"].Value.ToString();

您还使用Groups而不是match的{​​{1}}。

这就是为什么将变量命名为它们所代表的有意义的重要性。是的,它可能是一种“模式”,但这种模式代表什么。当您使用模糊命名的变量时,会产生类似这样的问题。

答案 2 :(得分:0)

你需要将它用于第二个正则表达式

([0][*]MAO[-][0][0][1].*?[*].*?[*].*?[*].*?[*].*?[*](?<Value2>\w+)[*])

\w是来自[A-Za-z0-9_]集的任何字符。您仅使用\d搜索数字[0-9],而不是

<强> C# Code

答案 3 :(得分:0)

你几乎得到了它,但你正在寻找的领域包含字母和数字。

这是你修复的第二种正则表达式。

([0][*]MAO[-][0][0][1].*?[*](?:.*?[*]){4}(?<Value2>.*?)[*])

 (                             # (1 start)
      [0] [*] MAO [-] [0] [0] [1] .*? [*] 

      (?: .*? [*] ){4}

      (?<Value2> .*? )              # (2)
      [*] 
 )                             # (1 end)

为了让它不那么繁忙,这可能会更好

(0\*MAO-001.*?\*(?:[^*]*\*){4}(?<Value2>[^*]*)\*)