0

正規表現を書こうとしていますが、欲張りすぎます。入力文字列は、次のいずれかの形式になります。

STUFF_12_1234 or STUFF_1234

私がやりたいのは、最後の の後の文字を取得するための正規表現を作成することです_。したがって、上記の例では、「1234」という数字になります。この最後の後の文字数は_さまざまで、文字と数字の組み合わせにすることができます。次の表現を試しました。

_(.*?)\Z

これは「1234」を返すことで「STUFF_1234」に対して機能しますが、「STUFF_12_1234」に対して使用すると「12_1234」を返します</p>

これを修正するために式をどのように変更する必要があるかについて誰かアドバイスがありますか?

4

5 に答える 5

2

最後のアンダースコアの後に表示されるテキストを取得するには、少なくとも 3 つの方法があります_

  • 現在の正規表現を保持しますが、指定します。正規表現は右から左に検索されるため、遅延量指定子は、文字列の最後の直後まで、できるだけ少ない文字と一致します。RightToLeft RegexOptions_

  • 正規表現を変更して、_照合するテキストでアンダースコアを許可しないようにします。

    _([^_]*)\Z
    
  • 入力文字列を分割し_、最後の項目を選択します。これString.Splitで十分なので、必要はありませんRegex.Split

于 2013-04-23T11:34:55.093 に答える
0

これを試して:

String s_YourString="STUFF_12_34";
String s_OP = Regex.Match(s_YourString, "_[^_.]+$").Value.Trim('_');//Output:34            
s_YourString="STUFF_1234";
s_OP = Regex.Match(s_YourString, "_[^_.]+$").Value.Trim('_');   //Output:1234
于 2013-04-23T12:00:26.213 に答える
0

正規表現を使用する

_([^_]*)\Z

正規表現は左から右に検索するため、貪欲さによって早期に停止するか遅く停止するかが制御されます。しかし、試合の左端の位置は変わりません。

于 2013-04-23T11:35:21.247 に答える
0

2 つのオプション。

  1. 正規表現を使用:

    _([^_]*?)
    

    _キャラクターを選択する必要はありません。

    _(\d*?)
    

    文字が数字であることがわかっている場合 ( \d)

  2. 部分文字列あり:

    yourString.Substring(yourString.LastIndexOf('_')+1)
    
于 2013-04-23T11:38:13.080 に答える