繁体   English   中英

从字符串中提取 substring 列表并从字符串中删除

[英]Extract list of substring from string and remove from string

我有一个字符串,必须提取 2 个不同单词('alpha' 和 'beta')之间的所有子字符串。 我必须返回带有两个字段的 json。

我以这种方式尝试过,但它不能正常工作:

            string content = "string working on";
            var listSubString = new List<string>();
            int index = 0;
            do
            {
                index = content.LastIndexOf("alpha");
                if (index != -1)
                {
                    var length = content.IndexOf("beta");
                    string substring= content.Substring(index, length);
                    content = content.Replace(substring, string.Empty);
                    listSubString.Add(substring.Replace("alpha", string.Empty).Replace("beta", string.Empty));
                }
            } while (index != -1);
Content = content;
ListSubString = listSubString;

我想要一个像"hello alpha I don't want this part 1 beta world alpha i don't want this part 2 beta have a nice day"这样的字符串接收一个 json 像{Content: "hello world have a nice day, ListSubString: ["i don't want this part 1", "i don't want this part 2"]}

谢谢您的帮助

我得到了你想要的 output,希望它能解决你的目的

链接: https://dotnetfiddle.net/b8T8qy

我在您的代码中更改了此代码部分

string substring= content.Substring(index, length-1);
listSubString.Insert(0, substring.Replace("alpha", string.Empty).Replace("beta", string.Empty));

最后我将 output 结果附加为 json 字符串。

string json = string.Join("\",\"", listSubString);
string otp = "{\"Content\" : \""+content+"\",\"ListSubString\": [\""+json+"\"]}";

Output:

{
  "Content": "hello world have a nice day",
  "ListSubString": [
    " I don't want this part 1  ",
    " i don't want this part 2  "
  ]
}

正则表达式允许您在没有索引和循环的情况下完成此操作。

一旦您确定了描述您要提取的子字符串的模式,例如"alpha.*?beta" ,那么在没有所述子字符串的情况下重建内容只是连接由正则表达式拆分的片段的问题:

Content = string.Join(string.Empty, new Regex("alpha.*?beta").Split(text);

根据子字符串本身,您可以在模式中捕获它们并从正则表达式返回的匹配中提取它们:

ListSubString = new Regex("alpha(.*?)beta")
    .Matches(text)
    .Select(match => match.Groups[1])
    .SelectMany(group => group.Captures.OfType<Capture>())
    .Select(capture => capture.Value)
    .ToList();

您可以查看此答案以了解有关Match > Group > Capture层次结构的一些说明。

感谢所有回复我的人。 最后,我决定这样做:

var splitedContent = content.Split(new string[] { "alpha", "beta" }, StringSplitOptions.None);

Content = string.Join(" ", splitedContent.Where((_, index) => index % 2 == 0));
Css = splitedContent.Where((_, index) => index % 2 != 0).ToList<string>();

正则表达式可能是最好和最高效的解决方案,但我不明白它是如何完美运行的,所以目前这是我的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM