.net正则表达式 - 需要帮助合并两个'表达式

时间:2015-11-06 14:41:57

标签: .net regex string

我试图为.net创建一个正则表达式:

  • A。)从混合字符值
  • 中提取1到4位数字
  • B。)在正斜杠后立即提取1到3位数字IF' /'
  

示例=所需结果:

     
      
  • abc1234abc1 = 1234
  •   
  • abc12345abc1 =没有结果
  •   
  • abc123 / 456abc1 = 456
  •   
  • abc1234 / 1234abc1 =没有结果
  •   

模式(?<!\d)\d{1,4}(?!\d)会产生以下结果:

  
      
  • abc1234abc1 = 1234(好)
  •   
  • abc12345abc1 =没有结果(好)
  •   
  • abc123 / 456abc1 = 123,456,1(坏)
  •   
  • abc1234 / 5678abc1 = 1234,5678,1(差)
  •   

此模式\/?[\d]{1,3}产生以下结果:

  
      
  • abc123 / 456abc1 = / 456(应该只是456)
  •   
  • abc1234 / 5678abc1 = / 567(应该没有结果)
  •   

我尝试在上面的模式周围放置一些看法,因此/ 5678没有返回值,但是当我这样做时,我根本没有得到任何值。

我的问题是我需要两个单独的表达式,还是可以在一个表达式中完成?一个是首选,但我不知道如何合并它们。谢谢!!

1 个答案:

答案 0 :(得分:1)

您可以使用

var lines = new string[] {"abc1234abc", "abc12345abc", "abc123/456abc", "abc1234/1234abc"};
foreach (string s in lines) 
{
   var matches = Regex.Matches(s, @"(?<![\d/])(?<num>\d{1,4})(?![\d/])|/(?<num>\d{1,3})(?!\d)");
   foreach (Match m in matches)
        Console.WriteLine(m.Groups["num"].Value);
}

请参阅IDEONE demo

正则表达式有两种选择:

  • (?<![\d/])(?<num>\d{1,4})(?![\d/])(匹配1-4个数字子串,不在/或数字之前或之后)
  • /(?<num>\d{1,3})(?!\d)(匹配前面带有/的1-3位数字后缀,后面没有数字。

您需要的值在一个命名组&#34; num&#34;。