1

編集: 1 つの文字列が欠落していました(... 8( 時間を無駄にして申し訳ありません。

次の形式の文字列のリストがあります。

"Some Text (1234-567890)"

これを の周りで使用string.SplitまたはRegex.Split分割して(から、最初の要素から前のテキストを引き出し、2 番目の要素から数字のテキストを引き出しようとしています。

元:

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, "\\(");

これを新しいプロジェクトに入れてみると、期待どおりに機能します。2 つの唯一の違いは、List<string>Excel 相互運用機能を使用してデータを入力していることです。なぜそれが違いを生むのかわかりません。

私の実際のコードは次のようになります。

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は、相互運用の Range 関数を使用して Excel シートから値を読み取り、それを にキャストしstringます。

4

5 に答える 5

1

表示するコードは期待どおりに機能します。その結果を取得する唯一の方法は、文字列に開始括弧が含まれていないことです。たとえば、 contains"Some Text 1234-567890)"と not"Some Text (1234-567890)"です。

また、ある環境では開始括弧のように見えるが、別の環境では印刷できない文字である、異常な文字が含まれている可能性もあります。

Exfel シートから文字列を取得するときに、文字列に実際に何が含まれているかを確認する必要があります。

于 2012-08-09T23:52:08.313 に答える
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(")","");

開き括弧をエスケープする必要があります。これは、正規表現エンジンにとって特別な意味を持ちます。

于 2012-08-09T23:38:00.723 に答える
0

このコードは動作するはずです:

string[] myValues = myText.Split(new string[] { "(" }, StringSplitOptions.None);
于 2012-08-09T23:47:42.980 に答える
0

データが正しくフォーマットされていませんでした。1行は次の形式でした:

"Some Text 1234-567890)"

そのため、Split メソッドはその文字列だけを返しました。

于 2012-08-09T23:49:43.590 に答える
0

これを行いたい場合は、コードを使用したソリューションです。新しい行 myValues[1]= myValues[1].Replace(")",""); を追加しました。これにより、元のコードが「(」を削除して機能することがわかる迷惑な「)」文字が削除され ますが、「(」と「)」には違いがあります。

「、」で区切られたパラメーターを渡すより良い例を次に示します。

string myText = "Some Text (1234-567890)";
string[] myValues = myText.Split('(',')');
string first = myValues[0]; // should hold "Some Text "
string second = myValues[1]; 
于 2012-08-09T23:53:20.677 に答える