1

かなり前から正規表現に出くわすことができましたが、残念ながら、困っている友達を助けることはできません。

私の「友達」は、次の基準に一致するテキストファイルのすべての行を一致させようとしています。

  1. 7〜10桁の数字のみ(0123456または0123456789)
  2. 7〜10桁の数字、ダッシュ、さらに2桁(0123456-01または0123456789-01)
  3. コード/コードまたはパスコード/パスコードが一致する番号の前にある場合を除いて、上記のいずれかに一致します(「アクセスコード:16434629」または「パスコード5253443-12」など)
  4. 編集:一致する番号のみが必要で、他には何も必要ありません。

これが、「彼」が私にくれたのを見た中で最も厄介な正規表現です。

^(?=.*?[^=/%:]\b\d{7,10}((\d?\d?)|(-\d\d))?\b)((?!Passcode|passcode|Code|code).)*$

..。

質問:上記の基準を満たすすべての行を見つけるために短い正規表現を使用する方法はありますか?

PCREを想定します。事前に友達に感謝します。;-)

ところで-私はこの質問に正確に答えることができるstackoverflow.comまたはsuperuser.comにリストされている他の質問を見つけることができませんでした。

編集:私はKodos PythonRegexDebuggerを使用して正規表現を検証およびテストしています。

4

2 に答える 2

4
(?<!(?:[Pp]asscode|[Cc]ode).*)[0-9]{7,10}(?:-[0-9]{2})?

コメントバージョン:

(?<!                 # Begin zero-width negative lookbehind. (Makes sure the following pattern can't match before this position)
(?:                  # Begin non-matching group
[Pp]asscode          # Either Passcode or passcode
|                    # OR
[Cc]ode              # Either Code or code
)                    # End non-matching group
.*                   # Any characters
)                    # End lookbehind
[0-9]{7,10}          # 7 to 10 digits
(?:                  # Begin non-matching group
-[0-9]{2}            # dash followed by 2 digits
)                    # End non-matching group
?                    # Make last group optional

編集:コメントディスカッション後の最終バージョン-

/^(?!\D*(?:[Pp]asscode|[Cc]ode))\D*([0-9]{7,10}(?:-[0-9]{2})?)/

(最初のキャプチャバッファになります)

于 2009-12-23T20:53:01.260 に答える
1

助けを借りなければならない厄介な正規表現でうまくいくことができます...

... または、2 つの単純な正規表現を使用できます。必要なものに一致するものと、不要なものをフィルタリングするもの。よりシンプルで読みやすい。

どちらを読みたいですか?

$foo =~ /(?<!(?:[Pp]asscode|[Cc]ode).*)[0-9]{7,10}(?:-[0-9]{2})?/

また

$foo =~ /\d{7,10}(-\d{2})?/ and $foo !~ /(access |pass)code/i;

編集:大文字と小文字を区別しません。

于 2009-12-23T21:02:21.350 に答える