如何使用(?!...)正则表达式模式跳过整个不匹配的部分?

时间:2017-07-13 10:22:01

标签: c# regex

我想使用((?!(SEPARATOR)).)*正则表达式模式来分割字符串。

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        var separator = "__";
        var pattern = String.Format("((?!{0}).)*", separator);
        var regex = new Regex(pattern);

        foreach (var item in regex.Matches("first__second"))
            Console.WriteLine(item);        
    }
}

SEPARATOR是单个字符时,它可以正常工作,但是当它长于1个字符时,我会得到意想不到的结果。在上面的代码中,第二个匹配的字符串是“_second”而不是“second”。如何修改模式以跳过整个不匹配的分隔符?

我真正的问题是分割行,我应该跳过引号内的行分隔符。我的行分隔符不是预定义的值,例如“\ r \ n”。

2 个答案:

答案 0 :(得分:1)

您可以这样做:

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string input = "plum--pear";
      string pattern = "-";            // Split on hyphens

      string[] substrings = Regex.Split(input, pattern);
      foreach (string match in substrings)
      {
         Console.WriteLine("'{0}'", match);
      }
   }
}


// The method displays the following output:
//    'plum'
//    ''
//    'pear'  

答案 1 :(得分:0)

.NET正则表达式不支持匹配特定多字符串以外的文本。在PCRE中,您将使用(*SKIP)(*FAIL)动词,但在本机.NET regex库中不支持它们。当然,您可能想要使用PCRE.NET,但.NET正则表达式通常可以很好地处理这些情况Regex.Split

如果您需要匹配[anything here]以外的所有内容,则可以使用

var res = Regex.Split(s, @"\[[^][]*]").Where(m => !string.IsNullOrEmpty(m));

如果分隔符是__之类的简单文字固定字符串,请使用String.Split

至于你的真正的问题,你似乎只需要

var res = Regex.Matches(s, "(?:\"[^\"]*\"|[^\r\n\"])+")
    .Cast<Match>()
    .Select(m => m.Value)
    .ToList();

请参阅regex demo

匹配+的1+(由于最终"),"以外的0 +字符,然后是""[^"]*"分支)或(|)任何字符,但CR,LF或/和"(见[^\r\n"])。