数字を2〜4回照合する正規表現


95

正規表現についての簡単な質問ですが、答えはわかりません。

数が正確に2回または4回連続して出現するかどうかを確認したい。どの構文を使用できますか?

\d{what goes here?}

試しました\d{2,4}が、この表現は3桁も受け入れます。


たとえば、2桁または4桁のに一致させます。
DavidRR

文字列が次の場合はabc 123 xyzどうしますか?それ12は正確に2桁の数字なので、一致する必要がありますか?それとも、それ自体は2でも4でもない12、より大きな数字列の一部なので、そうすべきではありません123か?私が推測しなければならなかった場合、私はあなたが後者の振る舞いを望んでいると思いますが、それはあなたの質問から明らかではありません。例および/またはより明確な仕様が役立ちます。同じ質問abc 12345 def...そこで何が起こるべきですか?
ジャン=フランソワ・コルベット

回答:


144

そのための特定の構文はありませんが、それを行う方法はたくさんあります。

(?:\d{4}|\d{2})    <-- alternation: four digits or two
\d{2}(?:\d{2})?    <-- two digits, and optionally two more
(?:\d{2}){1,2}     <-- two digits, times one or two

1
個人的には、\d{2}(?:\d{2})?すぐに解決策について考えただけでした-これらの素晴らしいバリエーション-特に、最後の解決策は非常に素晴らしく、スケーラブルに見えます。
Nightfirecat

3
+1は、最初に4桁、次に2桁と交互に使用する場合に必要な順序に注意してください。他のバリエーションを提供するのも良い仕事です。
Ahmad Mageed、

9
私のように、(?:これの使用を理解していない人は、「非キャプチャグループ」(replaceステートメントで参照されることを意図していないグループ)を開始します。括弧を使用することもできますが、これによりキャプチャグループが作成されます。詳細はこちら:stackoverflow.com/questions/3512471/non-capturing-group
Jeremy Moritz

これらは、「333」と「33」のどちらでも同じ結果を示します
Dan

1
@ダン:これらの正規表現は完全な文字列と一致しませ"333"。「完全な文字列が一致するかどうかをチェックする」機能ではなく、正規表現ライブラリの「一致する部分文字列を見つける」機能を誤って使用している可能性があります。そのドキュメントを参照してください。
ruakh 2017年

3
(?<!\d)(\d{2}|\d{4})(?!\d)

これが正しい方法です。受け入れられた答えは間違っています。

3桁(または5)に一致します。私の目ではそれは間違っています

1)2桁または4桁のシーケンスの前、または2桁または4桁のシーケンスの後に桁がないことを確認します。

  • (<!) 構文は否定的な後読みです

  • (?!) 構文は否定先読みです。

上記はミッドストリングで機能します:

検索文字列は、その周りにはコンテンツがありません場合は、使用することができます^し、$起動して、文字列アンカーの終わり:

^\d{4}$|^\d{2}$

1
受け入れられた答えが間違っているとは言いません。質問は不明確であると私は思います、そしてその答えはそれの一つの有効な解釈に対処します。あなたの答えは別の有効な解釈を扱っています(たぶん私はそれをより可能性の高いものだと思います-しかし、明らかに質問者はそうではありませんでした...)。
ジャン=フランソワ・コルベット

2
「3桁と一致する」というのは正確ではありません。「3桁のシーケンスの2桁のサブシーケンスに一致する」という意味だと思います。
ジャン=フランソワ・コルベット

1
また、あなたの答えは5桁以上のシーケンスでは意図したとおりに機能しません。I何の正規表現専門家だが、私は一つの方法と思い、それを修正するには、両方のケース(2-および4桁のシーケンス)に適用されます背後にある/否定先読みをすることです:(?<!\d)(\d{2}|\d{4})(?!\d)
ジャン=フランソワ・コルベット

私はあなたが5桁について正しいと思います。その訂正をありがとう。修正します。
JGFMK

^\d{4}$|^\d{2}$それを修正する潜在的な方法になるでしょう。ように^\d{2}(?!\d)|^\d{4}(?!\d)
JGFMK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.