1

我有一个小问题。我正在研究一个关键字字符串,它来自不同的提供商(我无法控制),他们都以不同的格式发送字符串。

字符串中的关键字可以用逗号、分号、空格或制表符分隔。在一个字符串中,仅使用一种类型的分隔符。

你将如何去认识它?

我在想类似的东西(伪代码):

string delimiters = { ",",";"," " };

var x = str.split(delimiters[0]).count();

var y = str.split(delimiters[1]).count();

var z = str.split(delimiters[2]).count();

然后检查哪个是最大的并使用它。

你知道更好的主意吗?

4

4 回答 4

1

您的想法非常有效,但我认为更好的解决方案是创建一个扩展方法并以这种方式返回一个锯齿状数组:

public static class Utilities {
    public static string[ ][ ] MultipleSplit( this string s, char[ ] delimiters ) {
        string[][] result = new string[ delimiters.Length ][ ];
        for ( int i = 0; i < delimiters.Length; i++ )
            result[ i ] = s.Split( delimiters[ i ] );

        return result;
    }

    public static string[ ] Larger( this string[ ][ ] jaggedArray ) {
        int index_larger = 0;

        for ( int i = 0; i < jaggedArray.Length; i++ ) {
            if ( jaggedArray[ i ].Length > jaggedArray[ index_larger ].Length )
                index_larger = i;
        }
        return jaggedArray[ index_larger ];
    }
}

然后像这里一样使用它:

string[][] result = str.MultipleSplit(delimiters);
string[] larger = result.Larger();
于 2012-10-02T10:29:28.090 回答
1

为什么不:

var result = str.Split(new[] {',', ';', ' '}, StringSplitOptions.None);

编辑:

var result = delimiters.Select(d => str.Split(d))
            .OrderByDescending(l => l.Count())
            .First();
于 2012-10-02T10:26:21.810 回答
0

尝试使用正则表达式进行拆分。一个正则表达式是 [,;\s]。这将查找逗号、分号空格或制表符。

于 2012-10-02T10:26:03.513 回答
0

虽然这里的建议可以接受并满足您当前的需求,但根本问题是

它来自不同的提供者(我无法控制),它们都以不同的格式发送字符串。

您需要就如何接受他们的信息与各种供应商达成某种形式的“合同”或协议。即使每个不同,系统也可以确定谁在提交数据并选择正确的解析器。

当前选项没有提供的一件事是确保您拥有良好数据的方法。如果提交的数据不好怎么办?你怎么知道?数据不好有关系吗?

于 2012-10-02T10:30:58.853 回答