4

携帯(イスラエル)電話番号正規表現の開発。現在私は持っています

re.compile(r'^[\(]?0?(5[023456789])\)?(\-)?\d{7}$')

ほとんどのユースケースをキャッチします。問題は、最初の1つの括弧が表示された場合にのみ、2番目の括弧と一致することです。

したがって、(055)-5555555または(055)5555555または0555555555は一致しますが、:055)-5555555は一致しません。2つの正規表現を使用して条件をテストできることは知っていますが(最初の正規表現が他の条件のテストと一致する場合)、それは賢明な解決策とは思えません。

正規表現のルックアラウンドのようなものが必要だと思いますが、それを使用する方法がわからない、または概念を正しく理解している

編集:ロジックの説明

市外局番:5で始まり、(特定のリストからの)1桁の数字で始まり、前にオプションが0である必要があります。括弧内にある可能性もあります。次に、オプションのハイフンと7桁の数字

明確化:もう一方が存在する場合にのみ、両方の括弧を一致させる必要があります。これは、2番目の括弧だけでなく、最初の括弧にも当てはまり、その点を見逃しました。

4

2 に答える 2

9

最初に開き括弧をキャプチャしてから、条件付きパターンを使用する必要があります(リンクが php.net であることは知っていますが、正規表現を参照するときに便利です。ケースと完全に一致する例も含まれています)。最初の左括弧が一致します。

パターン..

^(\()?0?(5[02-9])(?(1)\))-?(\d{7})$

一致します:

(055)-5555555
(055)5555555 
0555555555

しかし、そうではありません:

055)-5555555

キャプチャされたグループ

  1. 左括弧 (見つからない場合は空)
  2. 市外局番 (例: 55)
  3. 電話番号 (例: 5555555)

使い方

この部分(\()?は左括弧と一致します。オプションです。

パーツ(?(1)\))は、最初にキャプチャされたグループ (この場合は開き括弧) が一致するかどうかをチェックします。YES の場合文字列は閉じ括弧とも一致する必要があります。

左括弧が見つからない場合、条件は事実上無視されます。

于 2013-03-09T10:07:59.823 に答える
3

(?(id/name)yes-pattern|no-pattern)左括弧が一致した場合にのみ、右括弧を一致させる構文を使用します。

re.compile(r'^(\()?0?(5[023456789])(?(1)\))-?\d{7}$')

グループ 1 があれば、その(?(1)\))部分は一致します ( no パターンはオプションです)。\)|

デモ:

>>> phone.search('(055)-5555555')
<_sre.SRE_Match object at 0x101e18a48>
>>> phone.search('055)-5555555') is None
True
于 2013-03-09T09:39:08.540 に答える