【问题标题】:Remove text in between delimiters in a string that can contains the delimeter删除可以包含分隔符的字符串中分隔符之间的文本
【发布时间】:2020-07-31 14:06:27
【问题描述】:

我正在尝试从字符串中过滤一些文本/数据。

我的意图是最终得到两个字符串,即 t原始文本没有分隔符之间的文本(并且没有分隔符)和一个新的 字符串所有分隔符之间的字符。 问题是括号之间的数据可以包含任何内容,包括“[”、“]”和“,”。所以可能有一个单开括号 没有右括号可以在分隔符之间定义

这是一个例子: 这是一些输入文本。分隔符是 '[' 和 ']',因此应该从输入字符串中删除所有之间的内容(包括分隔符)。应保存周围括号(不包括括号)之间的数据。分隔符之间的所有字符串都应该连接成一个大字符串。

String input ="{[bra],pro,{[ckets[]]},ent[,HDR]}";

预期结果

String filteredText = "{,pro,{},ent}"; //The original text - the delimiters (surrounding brackets) - everything between the delimiters. 

String dataText = "brackets[],HDR"; //The text of all in-between delimiters without the surrounding brackets 

我尝试手动遍历整个字符串中的每个字符,并尝试找到起点和终点,以手动获取括号之间的数据。 像这样的:

[ = openCloseBracket +1

] = openCloseBracket -1

这样我们可以确定一个startIndex和一个endIndex。 这仅适用于所有包含右括号的开括号。 由于括号数据也可以包含括号,因此没有明确的开始和停止条件,所以这不起作用。 这就是为什么 RegEx 函数,例如 "<.>>"、"<.>?>" 或 "(\<.>\>)| (".")| ('.')|(\(.\))" 无法按预期过滤括号。

如何获取过滤后的文本和从文本中删除的字符(作为一个 charArray/字符串)(没有外部分隔符/括号)? 是否有更好、更简单的方法来手动循环整个文本?

【问题讨论】:

    标签: c# string-formatting


    【解决方案1】:

    这应该适用于手动循环:

    string input = "{[bra],pro,{[ckets[]]},ent[,HDR]}";
    StringBuilder filtered = new StringBuilder();
    StringBuilder data = new StringBuilder();
    
    int bracketCount = 0;
    
    foreach (char c in input)
    {
        if (bracketCount > 0)
        {
            if (c == '[')
                bracketCount++;
            else if (c == ']')
                bracketCount--;
    
            if (bracketCount > 0)
                data.Append(c);
        }
        else
        {
            if (c == '[')
                bracketCount++;
            else if (c == ']')
                bracketCount--;
            else
                filtered.Append(c);
        }
    }
    
    Console.WriteLine(filtered);
    Console.WriteLine(data);
    

    除非您确定所有输入都有效,否则您可能需要在循环中添加一些错误检查。确保括号匹配正确,等等。

    【讨论】:

    • 感谢您的支持,但如上所述,很遗憾,这不是解决此问题的合适方法。此解决方案仅在正确关闭所有括号时才有效。括号可以包含所有内容,因此它可能包含一个左括号而没有右括号。这使得定义开始条件和停止条件变得非常困难。一个麻烦的模式:"sometext[example[],[[sample]" 结果应该是:filtered = "sometext,";数据=示例[[样本
    • @fupon 然后在if (brackCount &gt; 0) 块和c == '[' 中时不要增加bracketCount
    • 真的,感谢您的支持。由于括号可以包含所有内容,因此括号也可以包含右括号而没有左括号。这就是为什么我在循环时难以定义开始条件和停止条件的原因。一个例子: "sometext[example[],[]sample] 结果应该是:filtered = "sometext"; data="example[]sample"; 第一部分包含一个没有右括号的左括号,第二部分包含一个右括号没有左括号的括号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2014-04-19
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多