【问题标题】:What is the proper way to split a string by regex [duplicate]通过正则表达式拆分字符串的正确方法是什么[重复]
【发布时间】:2016-08-30 15:04:38
【问题描述】:

我有一个带有自定义宏的文本字符串:

“一些文字{MACRO(parameter1)} 更多文字{MACRO(parameter2)}

为了处理宏,我想像这样拆分字符串:

预期结果

“一些文字”
“{宏(参数 1)}”
“更多文字”
"{MACRO(parameter2)}"

我尝试使用 Regex.Split() 拆分字符串

public static string[] Split(string input)
{
    var regex = new Regex(@"{MACRO\((.*)\)}");
    var lines = regex.Split(input)
    return lines;
}

但是 Regex.Split() 会删除匹配本身并给我以下信息:

实际结果

“一些文字”
“更多文字”

我知道我可以通过 .Match().Substring() 的迭代来解析字符串

但是有没有一种简单的方法可以将结果与匹配项一起获取?

【问题讨论】:

  • 你的模式不适合我。应该是@"{MACRO\([^})]*\)}"。这将正确拆分字符串。现在,如果您还将模式 ([^})]) 的参数部分设为捕获组(即完整模式应为 @"{MACRO\(([^})]*)\)}"),那么您的函数将按预期工作。
  • 试试这个regex = new System.Text.RegularExpressions.Regex(@"({MACRO\(.*?\)})");
  • 查看这个工作示例:dotnetfiddle.net/bClOo5
  • @GoodNightNerdPride 是的,示例中的正则表达式是错误的

标签: c#


【解决方案1】:

试试这个

            string input = "Some text {MACRO(parameter1)} more text {MACRO(parameter2)}";
            string pattern = @"(?'text'[^\{]+)\{(?'macro'[^\}]+)\}";
            MatchCollection matches = Regex.Matches(input, pattern);
            foreach (Match match in matches)
            {
                Console.WriteLine("text : '{0}'; macro : '{1}'", match.Groups["text"].Value.Trim(), match.Groups["macro"].Value.Trim());
            }
            Console.ReadLine();

【讨论】:

  • 无需求助于Regex.Matches()Regex.Split() 在使用捕获组时效果很好。
  • 晚安书呆子骄傲:Xplit() 返回一个字符串[]。使用我的代码,我将文本和宏分成两组,因此拆分不起作用。
猜你喜欢
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多