string.split但保持顺序匹配

时间:2015-04-24 23:14:30

标签: c# arrays regex

我已经对许多问题进行了筛选,但没有找到能够为我解答的问题。

string input = "~abc~~~123~~~hijkl~9";
string[] postSplit = input.Split('~');

我看到的回应是:

  

[0] - ""

     

[1] - " ABC"

     

[2] - ""

     

[3] - ""

     

[4] - " 123"

     

...

注意" abc"之间只有2个条目。和" 123"虽然有3个分隔符。

注意:我已经使用string.split和regex.split方法尝试了相同的结果。

如何确保无论顺序分隔符的数量是多少,我都会得到一个数组条目。 (" abc"" 123")之间的3个条目

提前致谢。

更新:

  1. 我明白这是预期的行为。
  2. 如果可以提供更多关于此事的信息,更多人可能会理解为什么不应该改变输入。
  3. 我的期望"对于解决方法/答案...可能必须是手工构建的扩展方法。只是想看看是否有人解决了这个问题,并且已经建立了这个轮子。
  4. UPDATE2:此场景中的波浪号表示字段的分隔符或从未放入字符串的空值。 ~a~b只是a和b之间的分隔符,但~~~~ c表示分隔符,空值,分隔符c

    UPDATE3:

    ~~~表示数组中的~~~ c [a] [""] [c] 〜表示数组中的〜b [a] [b] 在有效输入

    之间仅出现1和3的波形的倍数

    a ~~~~~~~~~ b应该等同于[a] [""] [""] [""]并[b]

5 个答案:

答案 0 :(得分:3)

注意:我写过another somewhat more helpful answer应该做你想做的事。

string.Split 本身不适合解决您的问题,因为这是它的工作原理:

  • 假设您将字符串"A,B"','分开作为分隔符。您将获得部分"A""B"一个分隔符,零空零件。

  • 现在让我们再次将"A,,B"拆分为','作为分隔符。您将获得部分"A""""B"两个分隔符,一个空白部分。

  • 然后让我们再次将"A,,,B"拆分为','作为分隔符。您将获得部分"A""""""B"三个分隔符,两个空白部分。

  • 一般规则是: n 连续分隔符会产生 n-1 空白部分。

也许现在你可以看到为什么~~~只产生两个空部分,而不是三个。

(如果您愿意使用string.Split以外的字符串方法,那么我的答案肯定不是很有帮助。)

答案 1 :(得分:2)

注意:此答案仅针对"更新"之前的问题部分。段落,因为它是在编辑问题之前编写的。

string.Split将为 n 连续的分隔符字符生成 n-1 个空白部分。因为你希望它能够生成 n 空的部分,所以只要它们中的几个连续出现,你就会变得很短。添加"缺失"在执行Split

之前,请执行以下操作
// using System.Text.RegularExpressions;

const string input = "~abc~~~123~~~hijkl~9";
string[] parts = Regex.Replace(input, "~~+", "$0~").Split('~');
//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

答案 2 :(得分:0)

来自:String.Split

  

如果两个分隔符相邻,或者在分隔符处找到分隔符   此实例的开头或结尾,对应的数组元素   包含空。

对此,Split方法按预期工作,您当前获得的结果是正确的。

答案 3 :(得分:0)

添加到@Amnon Shocot ......

        string input = "~abc~~~123~~~hijkl~9";
        var postSplit = input.Split(new char[] {'~'}, StringSplitOptions.RemoveEmptyEntries);
        var postSplit2 = input.Split('~').Where(ss => ss != String.Empty);

使用regurlar表达式,遗憾的是我们仍然需要过滤掉空字符串,因为第一次匹配。

        Regex rr = new Regex("~+"); // you may have been missing the +
        var postSplit3 = rr.Split(input).Where(ss => ss != String.Empty);

答案 4 :(得分:-1)

在vb:

    Dim input As String = "~abc~~~123~~~hijkl~9"
    Dim post() As String = input.Split({"~"c}, 3, StringSplitOptions.RemoveEmptyEntries)

看起来#3的余数包括~9

    Dim input As String = "~abc~~~123~~~hijkl~9".Replace("~~~", "~na~")
    If input.StartsWith("~") Then input = "na" & input
    If input.EndsWith("~~") Then input &= "~na"
    Dim post() As String = input.Split({"~"c})

这适用于示例字符串,但如果相邻字段包含占位符,则会变得更复杂。你可能不得不一次迭代替换的字符串,直到字符串长度不变。