String.Split方法在传递多个多字符分隔符时如何确定分隔符优先级?

Joh*_*ith 7 c# string tokenize stringtokenizer

如果你有这个代码:

"......".Split(new String[]{"...", ".."}, StringSplitOptions.None);
Run Code Online (Sandbox Code Playgroud)

生成的数组元素是:

 1. ""
 2. ""
 3. ""
Run Code Online (Sandbox Code Playgroud)

现在,如果你颠倒了分隔符的顺序,

"......".Split(new String[]{"..", "..."}, StringSplitOptions.None);
Run Code Online (Sandbox Code Playgroud)

生成的数组元素是:

 1. ""
 2. ""
 3. ""
 4. ""
Run Code Online (Sandbox Code Playgroud)

从这两个例子中,我倾向于得出结论,当从左到右遍历数组的每个元素时,Split方法递归地标记化.

但是,一旦我们将包含字母数字字符的分隔符放入等式中,很明显上述理论是错误的.

  "5.x.7".Split(new String[]{".x", "x."}, StringSplitOptions.None)
Run Code Online (Sandbox Code Playgroud)

结果是: 1. "5" 2. ".7"

   "5.x.7".Split(new String[]{"x.", ".x"}, StringSplitOptions.None)
Run Code Online (Sandbox Code Playgroud)

结果是: 1. "5" 2. ".7"

这次我们获得相同的输出,这意味着基于第一组示例理论化的规则不再适用.(即:如果始终根据数组中分隔符的位置确定分隔符优先级,那么在最后一个示例中,我们将获得"5."&"7"而不是"5"&".7".

至于为什么我浪费时间去猜测.NET标准API是如何工作的,这是因为我想为我的java应用程序实现类似的功能,但是StringTokenizer和org.apache.commons.lang.StringUtils都没有提供拆分的能力.使用多个多字符分隔符的字符串(即使我要找到提供此功能的API,也很难知道它是否始终使用String.Split方法使用的相同算法进行标记.

J. *_*eja 6

来自MSDN:

为了避免分隔符中的字符串具有共同字符时的模糊结果,Split操作从实例的值的开头到结尾进行,并匹配分隔符中等于实例中的分隔符的第一个元素.实例中遇到子字符串的顺序优先于分隔符中元素的顺序.

因此,对于第一种情况,"..."和"..."在同一位置上找到,并且它们在分隔符中的顺序用于确定使用的位置.对于第二种情况,在"x"之前找到".x".并且分隔符中元素的顺序不适用.