正则表达式用于捕获分隔列表中的值

时间:2013-09-17 09:47:10

标签: c# regex

我正在尝试编写一个正则表达式,它将从分隔列表中提取干净的值。问题在于列表可以用不同的符号或单词分隔。捕获的值将在代码中进行修剪,因此空格无关紧要。

输入:

English (UK), French* , German and Polish  & Russian; Portugese and Italian

我到目前为止的正则表达式:

\A(?:(?<Value>[^,;&*]+)[,;&\s*]*)*\Z

我期待的分隔符为,;&。我添加了*,因为我希望它从捕获的值中排除。

捕获的值:

English (UK), French, German and Polish, Russian, Portugese and Italian

预期值:

English (UK), French, German, Polish, Russian, Portugese, Italian

我遇到的问题是我无法将and视为分隔符。

3 个答案:

答案 0 :(得分:1)

我认为没有必要在这里使用Regex:

    string str = "English (UK), French* , German and Polish  & Russian; Portugese and Italian";
    string[] results = str.Split(new string[] { ",", ";", "&", "*" }, StringSplitOptions.RemoveEmptyEntries);
    foreach (string s in results)
        if (!string.IsNullOrWhiteSpace(s))
            Console.WriteLine(s);

答案 1 :(得分:1)

这就是我提出的:

\A(?:(?<Value>(?:[^,;&*\s]|\s(?!and))+)(?:(?:and|[,;&\s*])*))*\Z

<强>解释

(?:...)是一个非捕获组,不会更改匹配,只是不将结果存储在组中。

(?!...)为负前瞻,如果后面的字符与给定的模式不匹配,则匹配。

基本上,如果“和”不跟随它,它只会将空白作为Value的一部分进行匹配,并且它在分隔符中包含“和”。

这看起来非常复杂,您可能希望用分隔符替换" and "并使用当前表达式。

Test

答案 2 :(得分:0)

或者只是按照目前的结果执行此操作:

desiredResult = currentResult.Replace("and", ",");