正規表現は非常に複雑になる可能性があります。空白がないため、読みにくくなります。デバッガで正規表現をステップ実行できません。では、専門家は複雑な正規表現をどのようにデバッグしますか?
RegexBuddy を購入し、組み込みの デバッグ機能 を使用します。 1年に2回以上正規表現を使用している場合、このお金をすぐに節約できます。 RegexBuddyは、単純な複雑な正規表現を作成するのにも役立ち、さまざまな言語でコードを生成することもできます。
また、開発者によると、このツールは LinuxとWINEを併用した場合 でほぼ完璧に動作します。
Perl 5.10では、 use re 'debug';
。 (またはdebugcolor
ですが、Stack Overflowで出力を適切にフォーマットできません。)
$ Perl -Mre = debug -e '"foobar" =〜/(。)\ 1 /' コンパイルREx "(。)\ 1" 最終プログラム: 1:OPEN1(3) 3:REG_ANY(4) 4:CLOSE1(6) 6:REF1(8) 8: END(0) minlen 1 "foobar" 0 <> <foobar>に対するREx "(。)\ 1"のマッチング1:OPEN1(3) 0 <> <foobar> | 3:REG_ANY(4) 1 <f> <oobar> | 4:CLOSE1(6) 1 <f> <oobar> | 6:REF1(8) failed ... 1 <f> <oobar> | 1:OPEN1(3) 1 <f> <oobar> | 3:REG_ANY(4) 2 <fo> <obar> | 4:CLOSE1(6) 2 <fo> <obar> | 6:REF1(8) 3 <foo> <bar> | 8:END(0) マッチ成功! RExの解放: "(。)\ 1"
また、can正規表現に空白とコメントを追加して読みやすくします。 Perlでは、これは/x
修飾子。 pcre
には、PCRE_EXTENDED
フラグ。
"foobar" =~ /
(.) # any character, followed by a
\1 # repeat of previously matched character
/x;
pcre *pat = pcre_compile("(.) # any character, followed by a\n"
"\\1 # repeat of previously matched character\n",
PCRE_EXTENDED,
...);
pcre_exec(pat, NULL, "foobar", ...);
私はそれを忘れないように別のものを追加します: debuggex
それは非常に視覚的だから良い:
正規表現に固執するとき、私は通常これに目を向けます: https://regexr.com/
問題が発生している場所をすばやくテストするのに最適です。
Kodos -Python正規表現デバッガーを使用します。
Kodosは、Pythonプログラミング言語の正規表現を作成、テスト、およびデバッグするためのPython GUIユーティリティです。 Kodosは、開発者がPythonで正規表現を効率的かつ簡単に開発できるようにする必要があります。 Pythonの正規表現の実装は [〜#〜] pcre [〜#〜] 標準に基づいているため、Kodosは、PCRE標準(Perl、PHP、等...)。
(...)
Linux、Unix、Windows、Macで実行されます。
そうではないと思います。正規表現が複雑すぎて、デバッガが必要になるほど問題がある場合は、特定のパーサーを作成するか、別の方法を使用する必要があります。より読みやすく保守しやすくなります。
優れた無料ツール Regex Coach があります。最新バージョンはWindowsでのみ利用可能です。著者のEdmund Weitz博士は、ダウンロードする人が少なすぎるためにLinuxバージョンのメンテナンスを停止しましたが、ダウンロードページにはLinuxの古いバージョンがあります。
作成者のDamian ConwayによるRegexp :: Debuggerのプレゼンテーションを見ました。非常に印象的なもの:インプレースまたはコマンドラインツール(rxrx)を使用して、対話的にまたは「ログに記録された」実行ファイル(JSONに保存)で実行し、任意のポイントで前後にステップし、ブレークポイントまたはイベントで停止し、色付き出力(ユーザー設定可能) )、最適化のための正規表現と文字列のヒートマップなど.
CPANで無料で利用可能: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm
私は自分の目で正規表現をデバッグします。そのため、私は/x
修飾子を使用し、それらにコメントを書き、それらを部分に分割します。 Jeffrey FriedlのMastering Regular Expressionsを読んで、高速で読みやすい正規表現を開発する方法を学んでください。さまざまな正規表現デバッグツールは、ブードゥー教のプログラミングを引き起こします。
私に関しては、通常、任意の正規表現のバイトコードをダンプできるpcretestユーティリティを使用し、通常は読みやすくなっています(少なくとも私にとって)。例:
PCRE version 8.30-PT1 2012-01-01
re> /ab|c[de]/iB
------------------------------------------------------------------
0 7 Bra
3 /i ab
7 38 Alt
10 /i c
12 [DEde]
45 45 Ket
48 End
------------------------------------------------------------------
行き詰まっている場合は、後方に移動して、 txt2re を使用してサンプルテキストから直接正規表現を生成します(ただし、通常は結果の正規表現を手動で調整します)。
あなたがMacユーザーなら、私はこの1つに出くわしました:
http://atastypixel.com/blog/reginald-regex-Explorer/
無料で簡単に使用でき、一般的なRegExを理解するのに非常に役立ちました。
ActiveState Komodo に含まれるRx Toolkitを使用します。
PCREのような表記法を使用してreg exeを記述することは、アセンブラーを記述することに似ています。頭の中で対応する有限状態オートマトンを見ることができれば問題ありませんが、すぐに維持するのは難しくなります。
デバッガーを使用しない理由は、プログラミング言語でデバッガーを使用しない場合とほぼ同じです。ローカルの間違いは修正できますが、最初のローカルの間違いを引き起こした設計上の問題の解決には役立ちません。場所。
より反射的な方法は、データ表現を使用してプログラミング言語で正規表現を生成し、それらを構築するための適切な抽象化を行うことです。 Olin Shiverのスキーム正規表現表記法の紹介 は、これらのデータ表現の設計で直面する問題の優れた概要を示しています。
(non-free) regular-expressions.infoのツール をご覧ください。 RegexBuddy 特に。 この件に関するジェフアトウッドの投稿 。
私はしばしばpcretestを使用します-ほとんど「デバッガ」ではありませんが、テキストのみのSSH接続で動作し、必要な正規表現の方言を正確に解析します。などではありません.
一般に、正規表現デバッガーを必要とするのがコードの匂いである上記の人に同意します。私にとって正規表現の使用に関して最も難しいのは、通常、正規表現自体ではなく、それらを機能させるために必要な複数層の引用です。
これを試すことができます http://www.pagecolumn.com/tool/regtest.htm
私にとっては、正規表現を目撃した後(私はかなり流fluentで、ほぼ常に/ xまたは同等のものを使用します)、退化したマッチング(過度にバックトラックするもの)をヒットするかどうかわからない場合、テストするのではなくデバッグすることがありますたとえば、演算子の貪欲さを変更することでそのような問題を解決できるかどうかを確認します。
それを行うには、上記の方法のいずれかを使用します:pcretest、RegexBuddy(私の現在の職場がライセンスを取得している場合)、または同様のもの。C#正規表現で作業している場合、時々Linqpadで時間を計ります。
(Perlのトリックは私にとって新しいものなので、おそらくそれを正規表現ツールキットにも追加するでしょう。)