より良く学ぶために正規表現を試していて、以下のユースケースのようなものに一致する正規表現を記述できるかどうか疑問に思っていました。
文字列の例: 1_234_3456_345
期待される結果: 正規表現を使用して、この文字列の最初の 4 つの数値だけを照合したいと考えています。間のアンダースコアを無視して 1234 だけを意味します。
別の例: 123_7689_54A
期待される結果: 1237 (文字列の最初の 4 つの数字のみが一致し、その間の文字は無視されます)
私は次のようなものを試してみました:
/\d.*?\d.*?\d.*?\d/
しかし、上記の例では: (最初の例) と 2 番目の例 123_7 では、間の _ を省略したいと考えています。
私は何をしますか?そもそもそんなことが可能なのでしょうか?
正規表現の一致は常に、一致する文字列の部分文字列であるため、一致する部分文字列内の特定の部分文字列を「無視」することは不可能です。
代わりに、4 つの数字をそれぞれキャプチャ グループで囲んで、キャプチャした数字を文字列に結合することができます。
puts /(\d)\D*(\d)\D*(\d)\D*(\d)/.match("1_234_3456_345").captures.join
これにより次の出力が出力されます。
1234
デモ: https://ideone.com/UD7Q2g