2013-06-18 73 views
2

我正在开发一个通用的应用程序,我需要匹配一个我无法解决的模式。正则表达式匹配模式

输入字符串可能是:

12_B 99-23_9_23 

正如你所看到的例子,我的问题是,当我想与此模式匹配“B 99-23”。 分隔符可以是任何东西,不仅下划线(前12 |乙99-23 | 9 | 23。)

现在,这是我...

Regex r = new Regex("^(?< pol>\\w+)_(?< fac>\\w+)_(?< end>\\w+)_(?< op>\\w+)"); 

我必须改变这一部分: (?< fac>\\w+) 该模式必须将所有内容都带到下一个分隔符('_'),包括空格,数字,字符。 然后,我也会有这样的结果:

pol = 12 
fac = B 99-23 
end = 9 
op = 23 

回答

2

尝试使用这种模式:

^(?< pol>\w+)_(?< fac>[^_]+)_(?< end>\w+)_(?< op>\w+) 

[^_]有点character class这意味着“除下划线匹配任何内容”。如果分隔符是|,则必须在您的模式中使用\|,因为|在正则表达式中有特殊含义(尽管您不需要在字符类中转义它)。就像这样:

^(?< pol>\w+)\|(?< fac>[^|]+)\|(?< end>\w+)\|(?< op>\w+) 

在一个侧面说明,我觉得它更容易使用正则表达式模式时要使用逐字字符串,因为你将不必在打字这么多的转义序列:

new Regex(@"^(?< pol>\w+)\|(?< fac>[^|]+)\|(?< end>\w+)\|(?< op>\w+)"); 

然而,在这种情况下,你可能会更好只使用Split

var result = input.Split(new char[] { '_' }, 4); 
// result[0] = 12 
// result[1] = B 99-23 
// result[2] = 9 
// result[3] = 23 
+0

谢谢! 但是,这不适用于这个例子... 12 | B 99-23 | 9 | 23 它必须匹配,直到下一个分隔符。在上面的例子将是这样的:^ 很抱歉,如果我不解释它很好 –

+0

我已经(< pol> \ w +?)|(< fac>?)| |(< end> \ w +?)(< op> \ w +?)更新了我的答案,以包含适用于'|'字符的模式。你说过,“[分隔符可以是任何东西]”,但这没有多大意义。你期望什么分隔符?你需要处理混合分隔符吗?应如何匹配“12 | B 99_23 | 9 | 23”? –

0

说明

问题的一部分是,\w还包括所有字母a-z,所有数字0-9和底部_。因此,如果您输入文字可以使用_分隔符则表达式匹配\w+会感到困惑

因为你有一个条件,允许下划线作为分隔符,我建议,而不是使用短手\w是你,而不是定义字符类,你” d喜欢所需的文本和分隔符。

  • [0-9a-zA-Z]+将任何顺序
  • [^a-zA-Z0-9]这是一个否定的字符类,并且将匹配这是不alphebetical任何字符或数字

此正则表达式匹配匹配一个或多个alphebetical或数字所有的价值,并将允许范围广泛的分隔符。

^(?<pol>[0-9a-zA-Z]+)[^a-zA-Z0-9](?<fac>[0-9a-zA-Z]+\s[0-9a-zA-Z]+-[0-9a-zA-Z]+)[^a-zA-Z0-9](?<end>[0-9a-zA-Z]+)[^a-zA-Z0-9](?<op>[0-9a-zA-Z]+)

enter image description here

要匹配fac组我假设领域将在以下格式:字母数字空间连字符数。

  • 组0将获得整个匹配的字符串
  • 的命名组将被创建,但是在图像1 = POL,2 = FAC,3 =端,和4 = OP。对不起,绘图软件无法处理命名的捕获组。

C#代码示例:

输入文本

12_B 99-23_9_23 
11_a 11-11_1_11 
22|b 22-22|2|22 
33-c 33-33-3-33 
44,d 44-44,4,44 

代码

using System; 
using System.Text.RegularExpressions; 
namespace myapp 
{ 
    class Class1 
    { 
     static void Main(string[] args) 
     { 
      String sourcestring = "source string to match with pattern"; 
      Regex re = new Regex(@"^(?<pol>[0-9a-zA-Z]+)[^a-zA-Z0-9](?<fac>[0-9a-zA-Z]+\s[0-9a-zA-Z]+-[0-9a-zA-Z]+)[^a-zA-Z0-9](?<end>[0-9a-zA-Z]+)[^a-zA-Z0-9](?<op>[0-9a-zA-Z]+)",RegexOptions.IgnoreCase | RegexOptions.Multiline); 
      MatchCollection mc = re.Matches(sourcestring); 
      int mIdx=0; 
      foreach (Match m in mc) 
      { 
      for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++) 
       { 
       Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value); 
       } 
      mIdx++; 
      } 
     } 
    } 
} 

匹配

$matches Array: 
(
    [0] => Array 
     (
      [0] => 12_B 99-23_9_23 
      [1] => 11_a 11-11_1_11 
      [2] => 22|b 22-22|2|22 
      [3] => 33-c 33-33-3-33 
      [4] => 44,d 44-44,4,44 
     ) 

    [pol] => Array 
     (
      [0] => 12 
      [1] => 11 
      [2] => 22 
      [3] => 33 
      [4] => 44 
     ) 


    [fac] => Array 
     (
      [0] => B 99-23 
      [1] => a 11-11 
      [2] => b 22-22 
      [3] => c 33-33 
      [4] => d 44-44 
     ) 


    [end] => Array 
     (
      [0] => 9 
      [1] => 1 
      [2] => 2 
      [3] => 3 
      [4] => 4 
     ) 


    [op] => Array 
     (
      [0] => 23 
      [1] => 11 
      [2] => 22 
      [3] => 33 
      [4] => 44 
     ) 


)