条件に基づいて大文字を検索して置換する正規表現を作成したいと考えています。
文字列内の大文字のグループの先頭の大文字を見つけて、先頭の大文字の*
前で小文字に置き換えます。大文字の後に小文字がある場合は、大文字を小文字に置き換え、*
開始する大文字の前に置きます。
入力文字列:stackOVERFlow
期待される出力: stack*over*flow
私は試しましたが、完全に機能させることができませんでした。
正規表現を作成する方法について何か考えはありますか? ありがとう
予想される入力と出力は少し非論理的です。「フロー」の「f」を小文字にしていますが、アスタリスクには含めていません。
とにかく、必要な正規表現は非常に単純です: @"[A-Z]+?"
. これは、1 つ以上の大文字のアルファベット文字列に貪欲に一致します (一致する文字クラスが比較的狭いため、どちらの方法でも違いがあるとは思わないでください)。
ここで、検索/置換を行うには、次のようにします。
Regex.Replace(inputString, @"([A-Z]+?)", "*$1*").ToLower();
これは、1 つまたは複数の大文字のアルファベット文字のすべての出現箇所を単純に検索し、一致が見つかった場合は常に、それ自体をアスタリスクで囲んだものに置き換えます。これは周囲を処理しますが、小文字は処理しません。.NET Regex は、そのような文字列の変更を提供していません。ただし、操作の最終結果はすべて小文字の文字列である必要があるため、ToLower() を使用して正確に行うだけで、期待される結果が得られます。
KeithSのソリューションは少し単純化できます
Regex.Replace("stackOVERFlow","[A-Z]+","*$0*").ToLower()
ただし、これは星間stack*overf*low
も含めて譲ります。f
最後の大文字を除外する場合は、次の式を使用します
Regex.Replace("stackOVERFlow","[A-Z]+(?=[A-Z])","*$0*").ToLower()
それは得ますstack*over*flow
find(?=suffix)
これは、サフィックスの前の位置を見つけるパターンを使用します。