次のような文字列を見つける必要があります。
"^some_text/some_number$"
例えば:
"thetext/34526435"
が「ジェネリック」の場合some_text
は、スラッシュの後の数字を取り、「ジェネリック」を空の文字列にsome_text
置き換えます。そうでない場合は、数字とスラッシュを空の文字列に置き換えます。
これは1つの正規表現で可能ですか?
Microsoft.NET から使用Regex.Replace
しています。
C# では、はい。
C# 正規表現には、MatchEvaluator と呼ばれるものがあります。ここを参照してください:
http://msdn.microsoft.com/en-us/library/cft8645c.aspx
MatchEvaluator は、一致ごとに呼び出され、見つかった値をどうするかを尋ねます。決定したものはすべて文字列に置き換えられるため、値に基づいてさまざまな置換ロジックを使用できます。
入力がどのようなものかを述べていないので、次のコードを変更する必要があるかもしれません。また、テキスト部分がどのようなものであるかについても言及していないので[a-zA-Z]
、ガイドとして使用します. ただし、有効なテキスト部分 (など) であることを確認するために使用する方法に自由に変更してください\w
。
デリゲートの戻り値は簡潔に見えるかもしれませんが、質問の言い回しからすると、コード行数が多すぎないように感じます。if ステートメントなどで自由に拡張してください。
string sInput = "generic/1234";
string sOutput = Regex.Replace(sInput, "^(?<mytext>[a-zA-Z]+)/(?<mynum>\\d+)$", delegate(Match m)
{
return m.Groups["mytext"].Value.Equals("generic", StringComparison.OrdinalIgnoreCase) ? m.Groups["mynum"].Value : m.Groups["mytext"].Value;
});
テキスト部分が「一般的」である場合は数字を取ると述べましたが、スラッシュを含める必要があるかどうかについては言及しませんでした.
また、コードは特定の「テキスト/数値」パターンでのみ機能します。元の文字列がパターンと一致しない場合は、元の文字列を返します。
( demo )で置き換え^(generic/([0-9]+)|([a-z]+)/[0-9]+)$
てみてください。$2$3
パイソンでは、はい。
re
モジュールには、文字列内sub
の正規表現パターンのすべての出現をreplのようなrepl に置き換える関数呼び出しがあります
sub(pattern,repl, string)
こちらをご覧ください