【问题标题】:Finding text within a text block在文本块中查找文本
【发布时间】:2014-03-15 15:57:24
【问题描述】:

我正在寻找在某些 SWIFT 标签之间提升文本的最有效方法。

我的字符串包含以下内容

:59:/SOMETEXT
MORETEXT
EVEN MORE TET
:71A:/some other text

所以在上面的例子中,我需要存储 :59: 和 :70: 之间的所有文本行但是,标签 :59: 也可以表示如下:

:59a:/SOMETEXT
MORETEXT
EVEN MORE TET
:71A:/some other text

我正在考虑遍历每个标签并保存当前标签和前一个标签,然后检查前一个标签是否为 71A,但标签 59a 和标签 71a 之间可能还有更多“可选”标签

对如何处理有什么建议吗?

【问题讨论】:

    标签: c# swift-mt


    【解决方案1】:

    我会使用正则表达式,因为它们比循环更容易维护:

        public string GetText(string text, string tag1, string tag2)
        {
            return Regex.Match(text, String.Format(":{0}[^:]?:(?<text>(\n|.)*):{1}[^:]?:", tag1, tag2)).Groups["text"].Value;
        }
    

    【讨论】:

    • 嗨,这如何处理标签为 :59a: 或 :59: 的可能性?
    • 好的,所以我不在乎这个权利。我只是通过了 59 和 70,它返回了我想要的。干杯
    • 这是处理该问题的部分:[^:]?它表示除 : 以外的字符可能在也可能不在那个地方。
    【解决方案2】:
    var str = ":59:/SOME TEXT\n" +
              "MORE TEXT\n" +
              "EVEN MORE TEXT\n" +
              ":71A:/some other text\n";
    
    var text = str.Split("\n\r".ToCharArray()).SkipWhile(l => !l.StartsWith(":59")).TakeWhile(l => !l.StartsWith(":71"));
    
    var result = text.Select(l => new string(l.SkipWhile(c => Char.IsPunctuation(c) || Char.IsDigit(c)).ToArray()));
    
    foreach (var l in result)
        Console.WriteLine(l); 
    
    // output: SOME TEXT
    //         MORE TEXT
    //         EVEN MORE TEXT
    

    【讨论】:

    • 此方法从字符串中删除项目。在我的真实示例中,这会删除和正斜杠以及任何数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多