1

大文字と小文字を区別しない正規表現があります。

f?a?(x|csim)?(mob)?(ile\s*?)?(tel)?(e)?(phone|p|t|m)?\s*?:?\s*?(\s*?\(*?\d\)*?){8,10}

そして、これが私のテストケースです:

これらを一致させたい:

  • Tel:9555 5454
  • 電話0895555454
  • モバイル0411111111
  • 暴徒0411111111
  • モバイル:(0411)111111
  • 電話:(08)9555 5454
  • M0411111111
  • 電話番号:(08)9555 5454
  • p:(08)95 55 54 54
  • T:0895555454
  • ファクシミリ:(08)9555 5353
  • ファックス95555353
  • F 95 55 53 53

しかし、私はこれらを一致させたくありません

  • 0411 111 111
  • (08)9555 5454
  • 0411111111

基本的に、私は電話番号であると識別したものと一致させたいのですが、そのために識別子が前に付いている場合に限ります。

私の正規表現はプレフィックス付きの識別子と正常に一致しますが、全体が貪欲ではないため、「一致しない」テストケースは失敗します。これは、私の正規表現が「プレフィックスがあれば一致するが、それを必要としない」と指定しているためです。

何か案は?

  • 注意:私は正規表現のPerl/PHPバージョンを使用しています。
4

4 に答える 4

2

私のアドバイスは、正規表現を単純に保つことです。現在の正規表現にはすでに必要なプレフィックスが含まれていますが、正規表現のサイズを最小化するための作業により、偶然にもそれらはオプションになっています。

最小化を最小限に抑えると、次のようになります。

\b(tel(ephone)?|mob(ile)?|facsimile|fax|[tmpf]):?\s?(\(\d+\))(\d|\s)+

これにより、プレフィックスがオプションではなくなり、大量のガベージが受け入れられなくなります。例えば:

axilep: (08) 9555 5454
于 2012-09-14T09:35:42.997 に答える
1

スペース、数字、括弧、コロン以外の何かについて、試合の開始時に前向きな先読みをすることができます

だからあなたの:

f?a?(x|csim)?(mob)?(ile\s*?)?(tel)?(e)?(phone|p|t|m)?\s*?:?\s*?(\s*?\(*?\d\)*?){8,10}

になります:

(?=[^\s\d:()])f?a?(x|csim)?(mob)?(ile\s*?)?(tel)?(e)?(phone|p|t|m)?\s*?:?\s*?(\s*?\(*?\d\)*?){8,10}

ただし、pmakholmが指摘しているように、これはaxilepの問題には役立ちません。明示的な代替案の彼の解決策は読みやすく、奇妙なエッジケースを開いたままにしておく可能性は低くなります。

于 2012-09-14T10:09:03.707 に答える
0

これはどうですか:

(f?a?(x|csim)?(mob)?(ile\s*?)?(tel)?(e)?(phone|p|t|m)?)(?(1)\s*?:?\s*?(\s*?\(*?\d\)*?){8,10})
于 2012-09-14T09:15:26.963 に答える
0

または、文字通り質問に答えるには、接頭辞に一致する正規表現の部分と残りの部分の間に1文字に一致するアサーションの背後にゼロ幅のルックを追加することでそれを行うことができます。

f?a?(x|csim)?(mob)?(ile\s*?)?(tel)?(e)?(phone|p|t|m)?(?<=.)\s*?:?\s*?(\s*?\(*?\d\)*?){8,10}

これは、プレフィックスに一致するものを見つけた後、実際に文字があるかどうかを再確認することを意味します。

于 2012-09-14T09:41:33.803 に答える