私は次のものを持っています
address.gsub(/^\d*/, "").gsub(/\d*-?\d*$/, "").gsub(/\# ?\d*/,"")
これは 1 つの gsub で実行できますか? 1 つのパターンだけではなく、パターンのリストを渡したいのですが、それらはすべて同じものに置き換えられています。
それらを代替演算子 ( |
)と組み合わせることができます。
address = '6 66-666 #99 11-23'
address.gsub(/^\d*|\d*-?\d*$|\# ?\d*/, "")
# " 66-666 "
address = 'pancakes 6 66-666 # pancakes #99 11-23'
address.gsub(/^\d*|\d*-?\d*$|\# ?\d*/,"")
# "pancakes 6 66-666 pancakes "
空白のクリーンアップをもう少し追加することをお勧めします。また、次のいずれかに切り替えることもできます。
/\A\d*|\d*-?\d*\z|\# ?\d*/
/\A\d*|\d*-?\d*\Z|\# ?\d*/
データが実際にどのように見えるか、および改行をどのように処理する必要があるかによって異なります。
正規表現を組み合わせるのは良い考えで、比較的簡単ですが、いくつかの追加変更をお勧めします。ウィット:
address.gsub(/^\d+|\d+(?:-\d+)?$|\# *\d+/, "")
元の正規表現のうち、文字を消費する必要がないため、常に^\d*
一致し\d*-?\d*$
ます。したがって、空の文字列を空の文字列に置き換えるだけの場合でも、すべての行で 2 つの置換を実行することが保証されます。私の正規表現のうち、行の先頭に少なくとも 1 つの数字がない限り一致することはなく、行末の整数または範囲式のように見えるものと一致します。^\d+
\d+(?:-\d+)?$
3 番目の正規表現 ,は任意の文字に\# ?\d*
一致し、 の後にスペースと数字が続く場合は、それらも取得します。あなたの他の正規表現と他の質問での私の経験から判断すると、a の後に 1 つ以上の数字が続き、オプションのスペースが間にある場合にのみ、 a に一致するつもりだったのではないかと思います。それが私の3番目の正規表現です。#
#
#
私の推測のいずれかが間違っている場合は、何をしようとしていたかを説明してください。正しい正規表現を見つけるために最善を尽くします。しかし、少なくとも最初の 2 つの正規表現は、あなたが望むものではないと思います。
編集(コメントへの回答):正規表現を扱うときは、何にも一致しない正規表現と一致しない正規表現の違いに常に注意する必要があります。あなたは正規表現を番地に適用していると言っています。住所が番地で始まらない場合、何も一致しません。つまり、住所の最初の文字の前にある空の文字列で構成される一致が成功したことを報告します。^\d*
とにかく、それを別の空の文字列に置き換えるだけです。しかし、なぜわざわざ交換を行うのでしょうか? 正規表現を に変更すると^\d+
、一致の失敗が報告され、置換は実行されません。どちらの方法でも結果は同じですが、「一致する」シナリオ ( ^\d*
) では、「一致しない」シナリオでは回避できる多くの余分な作業が発生します。スループットの高い状況では、これは命の恩人になる可能性があります。
他の 2 つの正規表現には、さらに複雑な問題\d*-?\d*$
があります。アパート/オフィス番号の一部としてだけでなく、文字列内の任意の場所でハッシュ記号に一致する可能性があります。あなたは自分のデータを知っているので、おそらくこれらの問題のいずれも発生しないことを知っているでしょう。私はあなたがそれらを認識していることを確認しているだけです. 私の正規表現は末尾のハイフンの問題に対処し、少なくともハッシュ記号の後に数字があることを確認します。"123-"
"-"
\# ?\d*
\d+(?:-\d+)?$
\# *\d+
代替として、単一の gsub() 正規表現でそれらを組み合わせると、検索開始位置のコンテキストが変更されると思います。
たとえば、これらの各行は、前の
正規表現置換の結果の先頭から始まります。
s/^\d*//g
s/\d*-?\d*$//g
s/\# ?\d*//g
これ
s/^\d*|\d*-?\d*$|\# ?\d*//g
により、最後の一致が中断されたところから検索/置換が再開され、特に多くの部分式が
、同じではないにしても同様の文字を検索し、行アンカーのみで区別されるため、異なる全体的な出力が生成される可能性があります。
この場合、正規表現は十分に一意であると思います。もちろん、順序を
変更すると結果が変わります。