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

发布于 2024-07-12 05:39:40 字数 354 浏览 11 评论 0原文

我想分割示例字符串:

~彼得~路易斯~克里斯~梅格~史蒂伊

在字符 ~ 上,结果为

彼得
路易斯
克里斯
梅格
斯图伊

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

我一直在摆弄使用正则表达式,但我被难住了。 我确信有人已经找到了解决这个问题的优雅解决方案。

I would like to split the example string:

~Peter~Lois~Chris~Meg~Stewie

on the character ~ and have the result be

Peter
Lois
Chris
Meg
Stewie

Using a standard string split function in javascript or C# the first result is of course an empty string.
I'd like to avoid having to ignore the first result because the first result may actually be an empty string.

I've been fiddling around with using a regular expression and I'm stumped.
I'm sure somebody has come across and elegant solution to this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

不知在何时 2024-07-19 05:39:40

对于您的要求,我看到两个选项:

(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.Groups1 .Value”是第一个包含无分隔符字符串的匹配组。

为了完整起见,包含第三种编码 (#3),显示与 #2 中相同的正则表达式方法,但采用 LINQ 编码风格。

如果您在正则表达式方面遇到困难,我强烈推荐 杰弗里·EF·弗里德尔 (Jeffrey EF Friedl) 的《掌握正则表达式,第三版》< /a>. 到目前为止,它是理解正则表达式的最佳帮助,并且可以根据需要在以后作为极好的参考或复习。

For your requirements, I see two options:

(1) Remove the initial prefix character, if present.

(2) Use a full regular expression to separate the string.

Both are illustrated in this code:

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+"'"))
    ;
}}

The regular expression in #2 matches the delimiter character followed by a match group containing zero or more non-delimiter characters. The resultant matches are the delimited strings (including any empty strings). For each match, "match.Value" is the entire string including leading delimiter and "match.Groups1.Value" is the first match group containing the delimiter free string.

For completeness, the third encoding (#3) is included showing the same regular expression method in #2, but in a LINQ coding style.

If you are struggling with regular expressions, I highly recommend Mastering Regular Expressions, Third Edition by Jeffrey E. F. Friedl. It is, by far, the best aid to understanding regular expressions and later serves as an excellent reference or refresher as needed.

苄①跕圉湢 2024-07-19 05:39:40

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

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

In C#, this seems to get what you want:

"~Peter~Lois~Chris~Meg~Stewie".Split("~".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
何时共饮酒 2024-07-19 05:39:40

这是 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();
        }
    }
}

Here's a LINQ approach...

Note, with RegexOptions.ExplicitCapture the matches are not included. Without it the '~' will be included as well.

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();
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文