String.Split和Regex.Split无法正常工作?

时间:2012-08-09 23:29:42

标签: c# excel-interop

编辑:单个字符串缺少( ... 8(很抱歉浪费你的时间。

我有以下格式的字符串列表:

"Some Text (1234-567890)"

我正在尝试使用string.SplitRegex.Split将其拆分为(,然后从第一个元素中拉出前一个文本,并从第二个元素中删除数字文本。

例如:

string myText = "Some Text (1234-567890)";
string[] myValues = myText.Split('(');
string first = myValues[0]; // should hold "Some Text "
string second = myValues[1]; // should hold "1234-567890)"

相反,我得到的是,无论我使用string.Split还是Regex.Split,我都知道这是一个包含没有(的单个值的数组。

例如:

string myText = "Some Text (1234-567890)";
string[] myValues = myText.Split('(');
string first = myValues[0]; // has "Some Text 1234-567890)"
string second = myValues[1]; // exception; there is no second value

如果我使用Regex.Split,也会发生这种情况。例如:

string[] myValues = Regex.Split(myText, "\\(");

如果我尝试将它放入一个新项目中,它就像我期望的那样工作。两者之间的唯一区别是我使用Excel互操作填充List<string>。我不明白为什么会产生影响。

我的实际代码如下:

const int LOCATION_START = 2;
const int LOCATION_END = 39;
List<string> locationStrings = new List<string>();
for (int row = LOCATION_START + 1; row <= LOCATION_END; row++)
   locationStrings.Add(pExcel.ActiveSheet.ReadValue<string>(row));

List<Tuple<string, string>> locations = new List<Tuple<string, string>>();
foreach (string locationString in locationStrings)
{
   string[] values = Regex.Split(locationString, "\\(");
   locations.Add(Tuple.Create(values[0].Trim(), values[1].Substring(0, 11)));
   // ^ this line throws an exception, because there is only one value, not two
}

Excel.ActiveSheet.ReadValue使用互操作范围函数从Excel工作表中读取值并将其强制转换为string

5 个答案:

答案 0 :(得分:1)

您显示的代码按预期工作。获得该结果的唯一方法是该字符串不包含任何起始括号,例如包含"Some Text 1234-567890)"而不是"Some Text (1234-567890)"

你也有可能在一个环境中看起来像一个起始括号,但在另一个环境中是一个不可打印的字符。

当您从Exfel表中获取字符串时,应检查字符串实际包含的内容。

答案 1 :(得分:0)

string Source = "Some Text (1234-567890)";
string[] Splitted = Regex.Split(Source, @"\(");
foreach (string Item in Splitted)
Console.WriteLine(Item.Replace(")",""); //Use replace if you want to remove the closing bracket.
//Map the values
string First = Splitted[0];
string Second = Splitted[1].Replace(")","");

你需要逃离开口支架。它对正则表达式引擎有特殊意义。

答案 2 :(得分:0)

此代码应该有效:

string[] myValues = myText.Split(new string[] { "(" }, StringSplitOptions.None);

答案 3 :(得分:0)

数据格式不正确。一行的形式如下:

"Some Text 1234-567890)"

因此Split方法只返回该字符串。

答案 4 :(得分:0)

如果你想这样做是一个使用你的代码的解决方案我刚刚添加了一个新的行     myValues [1] = myValues [1] .Replace(“)”,“”); 这会删除你看到的烦人的“)”字符 您的原始代码有效删除“(”但“(”和“)之间存在差异”

以下是传递由“,”

分隔的params的更好示例
string myText = "Some Text (1234-567890)";
string[] myValues = myText.Split('(',')');
string first = myValues[0]; // should hold "Some Text "
string second = myValues[1];