我想使用((?!(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”。
答案 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"]
)。