如何保留Regex的分隔符,在所有结果子字符串中拆分?

yrefmtwq  于 2023-05-30  发布在  其他
关注(0)|答案(3)|浏览(145)

我想使用Regex.Split来分割分隔符,并将该分隔符分割到所有子字符串上。
例如:我有一个字符串"holidays/*/2024",和分隔符'*',我想有以下内容:"holidays/*","*/2024"
This线程展示了如何拆分和保留分隔符作为其自己的结果元素。我还能够分别使用Lookbehind (?<=[*])和Lookahead (?=[*]),每个都实现了预期结果的一半。我正在努力了解如何使用这两种(或替代解决方案)来在单个表达式中实现所需的结果。
有什么建议吗?

rjzwgtxy

rjzwgtxy1#

使用Regex拆分字符串。

using System;
    using System.Text.RegularExpressions;
    
    public class Program
    {
        public static void Main()
        {
            string input = "holidays/*/2024";
            string pattern = @"(?<=\*)|\*(?=/)";
    
            string[] substrings = Regex.Split(input, pattern);
            foreach (string substring in substrings)
            {
                Console.WriteLine(substring);
            }
        }
    }

    Output

    holidays/
    /2024

我希望这对你有帮助!

dauxcl2d

dauxcl2d2#

我不懂C#,但一个简单的循环就足够了:

string[] splitted = text.Split(delimiter);

for (var i = 0; i < splitted.Length; i++) {
    var fragment = splitted[i];

    if (i > 0) {
        fragment = delimiter + fragment;
    }

    if (i < splitted.Length - 1) {
        fragment += delimiter;
    }

    Console.WriteLine(fragment);
}

试试on dotnetfiddle.net

m0rkklqb

m0rkklqb3#

另一个解决方案是使用这个看起来很可怕的正则表达式:

Regex re = new Regex(
  @"
    (?:^|\*)        # Match and capture either the beginning of string or '*',
    (?=             # then
      ([^*]+)       # a group 1+ non-'*' characters, followed by
      (\*|$)        # another group of '*' or the end of string.
    )
  ",
  RegexOptions.IgnorePatternWhitespace
);

...然后.Join()每个匹配中的组以获得最终结果:

MatchCollection matches = re.Matches(text);

foreach (Match match in matches) {
  Console.WriteLine(
    String.Join("", (
      from Group matchGroup in match.Groups
      where matchGroup.ToString() != ""
      select matchGroup.ToString()
    ))
  );
}

试试on dotnetfiddle.net

相关问题