2015-11-06 59 views
2

我试图创建一个正则表达式.NET将:.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(应resturn没有结果)

我试图把lookarounds围绕上面的图案,以便/ 5678没有返回值,但是当我这样做,无论我根本没有得到值。

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

+0

是字符串的'1'部分吗?请参阅[本演示](http://regexstorm.net/tester?p=(%3f%3c!%5b%5cd%2f%5d)(%3f%3cnum%3e%5cd%7b1%2c4%7d)( %3F!%5B%5CD%2F%5D)%7C%2F(%3F%3cnum%3E%5CD%7B1%2C3%7D)(%3F!%5CD)I = abc1234abc%0D%0aabc12345abc%0D%0aabc123 %2f456abc%0D%0aabc1234%2f1234abc)。 –

+0

如果您在末尾abc123/456abc“1”处引用1,否则,我只是将它放在那里作为“混合字符值”的一部分。您提供的演示看起来不错,只是结果不应该包含/但应该是斜杠后面的值(IE只是456而不是/ 456) – Alex

+0

结果不是'Match.Value',而是'Match。组[ “编号”]。Value'。请参阅[此IDEONE演示](http://ideone.com/NP1bSw)。 –

回答

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

正则表达式有2种选择:

  • (?<![\d/])(?<num>\d{1,4})(?![\d/])(不匹配的前面或后面有/或数字1-4的数字串)
  • /(?<num>\d{1,3})(?!\d)(匹配1-3位数的子串优先d与/,后面跟着一个数字。

您需要的值位于已命名的组“num”中。