2017-05-29 11 views
-1

これは、文字区切り文字を指定する文字列の右側を取得し、区切り文字を文字列内に保持するかどうかのコードです。また、直前に出現した文字区切り文字を指定したり、手動で区切り文字を定義することもできます。私の質問は、同じバージョンを作る方法ですが、今回は文字列の右端を残す代わりに取得するのですか?文字列の右側を区切り文字で指定します。

Public Shared Function GetLetSideStringByChar(splitterChar As String, searchingWord As String, keepCharAsWell As Boolean, lastindexof As Boolean, splitterCharPosition As Integer) As String 
     Dim index As Integer 
     Select Case lastindexof 
      Case False 
       index = GetNthIndex(searchingWord, splitterChar, splitterCharPosition) 
      Case True 
       index = searchingWord.LastIndexOf(splitterChar) 
     End Select 

     If index > 0 Then 
      If keepCharAsWell Then 
       searchingWord = searchingWord.Substring(0, index + splitterChar.Length) 
      Else 
       searchingWord = searchingWord.Substring(0, index) 
      End If 
     Else 
      searchingWord = String.Empty 
     End If 
     Return searchingWord 
    End Function 

    'jesli n separator nie odnalzeiony bedzie return -1, np jesli charseparator = . i damy n = 2 a word bedzie mial tlko jedna . to -1 
    Public Shared Function GetNthIndex(searchingWord As String, charseparator As Char, n As Integer) As Integer 
     Dim count As Integer = 0 
     For i As Integer = 0 To searchingWord.Length - 1 
      If searchingWord(i) = charseparator Then 
       count += 1 
       If count = n Then 
        Return i 
       End If 
      End If 
     Next 
     Return -1 
    End Function 
+0

この関数にもかかわらず、 'string.Split'を使用しない複雑な方法があります。何を試しましたか? – gobes

+0

[特定の要件による文字列の特定の文字列部分を取る]の可能な複製(https://stackoverflow.com/questions/44240579/take-specific-string-part-of-string-by-specific-requments) – Mike

+0

searchingWord.Substring (インデックス)?また、すべての文字をループする代わりにIndexOfを使用することもできます。 –

答えて

0

以前に削除した問題のコードを記述しました。

Public Enum Direction 
    Left = 0 
    Right = 1 
End Enum 

が、あなたはこのような関数を呼び出すことができます:ここで

Console.WriteLine(StringExtract("5345.342.323.323#$%", Direction.Right, 2, False)) 

セパレーターインデックスはドット数を表します(開始 コードをより理解しやすくするためには、私は右または左を指定する列挙型を使用しました

例えば:1)

648674.2327.12最初のドットは、秒

そして、ここである関数である、私はそれを短縮することができ確信している:

Public Function StringExtract(ByVal MyStr As String, ByVal Side As Direction, ByVal SeperatorIndex As Integer, ByVal SeperatorKeep As Boolean) As String 
    Dim MySubs() As String = MyStr.Split(".".ToCharArray, StringSplitOptions.RemoveEmptyEntries) 
    Dim IndexOfSplit As Integer 
    Dim MyResult As String = "" 
    If Side = Direction.Left Then 
     IndexOfSplit = SeperatorIndex - 1 
     For i As Integer = IndexOfSplit To 0 Step -1 
      MyResult = MyResult.Insert(0, MySubs(i) & ".") 
     Next 
     If SeperatorKeep = False Then 
      MyResult = MyResult.Remove(MyResult.LastIndexOf("."), 1) 
     End If 
    Else 
     IndexOfSplit = SeperatorIndex 
     For i As Integer = IndexOfSplit To MySubs.Length - 1 
      MyResult = MyResult & MySubs(i) & "." 
     Next 
     If SeperatorKeep = False Then 
      MyResult = MyResult.Remove(MyResult.LastIndexOf("."), 1) 
     Else 
      MyResult = "." & MyResult.Remove(MyResult.LastIndexOf("."), 1) 
     End If 
    End If 
    Return MyResult 
End Function 

出力例:

入力1:

StringExtract("5345.342.323.323#$%", Direction.Right, 2, False) 

出力1:

323.323の#$%

入力2:

StringExtract("5345.342.323.323#$%", Direction.Right, 3, True) 

出力2:

0.323の#$%

入力3:

StringExtract( "4.34 2.3323!。"、Direction.Left、2、TRUE)

出力3:

434!2。

PS:誰も私が私が学ぶことが幸せだ知っている機能を短縮するために何か提案がある場合。

関連する問題