如何使用正则表达式使用前缀字符进行拆分?

时间:2009-02-01 02:13:50

标签: regex split character prefix

我想拆分示例字符串:

  

〜彼得〜意向书〜克里斯〜梅格〜的Stewie

在角色~上,结果为

  

彼得
  洛伊丝
  克里斯
  梅格
  Stewie

在javascript或C#中使用标准字符串拆分功能,第一个结果当然是空字符串。 我想避免忽略第一个结果,因为第一个结果可能实际上是一个空字符串。

我一直在使用正则表达式摆弄,我很难过。 我确信有人遇到了这个优雅的解决方案。

3 个答案:

答案 0 :(得分:4)

根据您的要求,我看到两个选项:

(1)删除初始前缀字符(如果存在)。

(2)使用完整的正则表达式来分隔字符串。

这两个代码都在这个代码中说明:

using System;
using System.Linq;
using System.Text.RegularExpressions;

class APP { static void Main() {

string s = "~Peter~Lois~Chris~Meg~Stewie";

// #1 - Trim+Split
Console.WriteLine ("[#1 - Trim+Split]");
string[] result = s.TrimStart('~').Split('~');
foreach (string t in result) { Console.WriteLine("'"+t+"'"); }

// #2 - Regex
Console.WriteLine ("[#2 - Regex]");
Regex RE = new Regex("~([^~]*)");
MatchCollection theMatches = RE.Matches(s);
foreach (Match match in theMatches) { Console.WriteLine("'"+match.Groups[1].Value+"'"); }

// #3 - Regex with LINQ [ modified from @ccook's code ]
Console.WriteLine ("[#3 - Regex with LINQ]");
Regex.Matches(s, "~([^~]*)")
    .OfType<Match>()
    .ToList()
    .ForEach(m => Console.WriteLine("'"+m.Groups[1].Value+"'"))
    ;
}}

#2中的正则表达式匹配分隔符,后跟包含零个或多个非分隔符的匹配组。结果匹配是分隔的字符串(包括任何空字符串)。对于每个匹配,“match.Value”是整个字符串,包括前导分隔符和“match.Groups 1。Value”是包含分隔符空闲字符串的第一个匹配组。

为了完整性,包括第三个编码(#3),在#2中显示相同的正则表达式方法,但是采用LINQ编码风格。

如果您正在努力使用正则表达式,我强烈推荐Mastering Regular Expressions, Third Edition by Jeffrey E. F. Friedl。到目前为止,这是理解正则表达式的最佳帮助,以后可以作为一个很好的参考或复习。

答案 1 :(得分:1)

在C#中,这似乎得到了你想要的东西:

"~Peter~Lois~Chris~Meg~Stewie".Split("~".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

答案 2 :(得分:1)

这是LINQ方法......

注意,使用RegexOptions.ExplicitCapture时不包含匹配项。如果没有它,也会包括'〜'。

using System;
using System.Linq;
using System.Text.RegularExpressions;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "~Peter~Lois~Chris~Meg~Stewie";
            Regex.Split(s, "(~)", RegexOptions.ExplicitCapture)
                .Where(i=>!String.IsNullOrEmpty(i))
                .ToList().ForEach(i => Console.WriteLine(i));
            Console.ReadLine();
        }
    }
}