2015-11-05 9 views
10
string s = "Gewerbegebiet Waldstraße"; //other possible input "Waldstrasse" 

int iFoundStart = s.IndexOf("strasse", StringComparison.CurrentCulture); 
if (iFoundStart > -1) 
    s = s.Remove(iFoundStart, 7); 

私はCultureInfo 1031(ドイツ語)を実行しています。IndexOfをCultureInfoで使用するArgumentOutOfRangeException 1031

IndexOfは 'strasse'と 'strasse'を 'strasse'でマッチさせ、positionとして18を返します。

除去も置換も培養物を設定するための負荷がありません。

削除文字列を使用して6文字を削除すると、入力文字列が「strasse」で「straße」が機能する場合は残ります。 input-stringが 'straße'で、7個の文字を削除した場合、私はArgumentOutOfRangeExceptionを取得します。

見つかった文字列を安全に削除する方法はありますか? IndexOfの最後のインデックスを提供する任意のメソッド?私はIndexOfに近づき、期待通りにネイティブコードになっています。何か独自のことを行う方法はありません。

+0

空の文字列に置き換えるのはどうですか? '' ss = s.Replace( "strasse"、 ""); ' – dotctor

+0

@dotctor私はOPが' string.Replace'は文化を考慮しないと言っていると信じているので、 "ss"は "ß " – juharr

+0

Imは 'en-US'で動作し、この問題が発生しました。IndexOfは異なる動作をします。 –

答えて

5

ネイティブWin32 APIは、見つかった文字列の長さを公開します。あなたは直接FindNLSStringExを呼び出すためにP /呼び出しを使用することができます。

static class CompareInfoExtensions 
{ 
    [DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)] 
    private static extern int FindNLSStringEx(string lpLocaleName, uint dwFindNLSStringFlags, string lpStringSource, int cchSource, string lpStringValue, int cchValue, out int pcchFound, IntPtr lpVersionInformation, IntPtr lpReserved, int sortHandle); 

    const uint FIND_FROMSTART = 0x00400000; 

    public static int IndexOfEx(this CompareInfo compareInfo, string source, string value, int startIndex, int count, CompareOptions options, out int length) 
    { 
     // Argument validation omitted for brevity 
     return FindNLSStringEx(compareInfo.Name, FIND_FROMSTART, source, source.Length, value, value.Length, out length, IntPtr.Zero, IntPtr.Zero, 0); 
    } 
} 

static class Program 
{ 
    static void Main() 
    { 
     var s = "<<Gewerbegebiet Waldstraße>>"; 
     //var s = "<<Gewerbegebiet Waldstrasse>>"; 
     int length; 
     int start = new CultureInfo("de-DE").CompareInfo.IndexOfEx(s, "strasse", 0, s.Length, CompareOptions.None, out length); 
     Console.WriteLine(s.Substring(0, start) + s.Substring(start + length)); 
    } 
} 

私は純粋にBCLを使ってこれを行う方法を見ていませんよ。

+0

「BerlinerStraße」にマッチさせ、CompareOptions.IgnoreCaseを使用したい場合、これは失敗します。なぜでしょうか? – isHuman

+0

@isHuman私は 'CompareOptions'から' FindNLSStringEx'オプション値への変換を省きました。 'options'パラメータが使われていないことが分かります。 'CompareOptions.IgnoreCase'から' LINGUISTIC_IGNORECASE'または 'NORM_IGNORECASE'(あなたによって決定される)への変換を加える必要があります。 – hvd

+0

今は同じように見えました:)試してみます。 – isHuman

関連する問題