web-dev-qa-db-ja.com

正規表現をどのようにデバッグしますか?

正規表現は非常に複雑になる可能性があります。空白がないため、読みにくくなります。デバッガで正規表現をステップ実行できません。では、専門家は複雑な正規表現をどのようにデバッグしますか?

145
rook

RegexBuddy を購入し、組み込みの デバッグ機能 を使用します。 1年に2回以上正規表現を使用している場合、このお金をすぐに節約できます。 RegexBuddyは、単純な複雑な正規表現を作成するのにも役立ち、さまざまな言語でコードを生成することもできます。

alt text

また、開発者によると、このツールは LinuxとWINEを併用した場合 でほぼ完璧に動作します。

67
Mick

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", ...);
51
ephemient

私はそれを忘れないように別のものを追加します: debuggex

それは非常に視覚的だから良い: Photo of the Debuggex regex helper

29
kevin

正規表現に固執するとき、私は通常これに目を向けます: https://regexr.com/

問題が発生している場所をすばやくテストするのに最適です。

28
thetaiko

Kodos -Python正規表現デバッガーを使用します。

Kodosは、Pythonプログラミング言語の正規表現を作成、テスト、およびデバッグするためのPython GUIユーティリティです。 Kodosは、開発者がPythonで正規表現を効率的かつ簡単に開発できるようにする必要があります。 Pythonの正規表現の実装は [〜#〜] pcre [〜#〜] 標準に基づいているため、Kodosは、PCRE標準(Perl、PHP、等...)。

(...)

alt text

Linux、Unix、Windows、Macで実行されます。

18
Pascal Thivent

そうではないと思います。正規表現が複雑すぎて、デバッガが必要になるほど問題がある場合は、特定のパーサーを作成するか、別の方法を使用する必要があります。より読みやすく保守しやすくなります。

13
Valentin Rocher

優れた無料ツール Regex Coach があります。最新バージョンはWindowsでのみ利用可能です。著者のEdmund Weitz博士は、ダウンロードする人が少なすぎるためにLinuxバージョンのメンテナンスを停止しましたが、ダウンロードページにはLinuxの古いバージョンがあります。

11
APC

作成者のDamian ConwayによるRegexp :: Debuggerのプレゼンテーションを見ました。非常に印象的なもの:インプレースまたはコマンドラインツール(rxrx)を使用して、対話的にまたは「ログに記録された」実行ファイル(JSONに保存)で実行し、任意のポイントで前後にステップし、ブレークポイントまたはイベントで停止し、色付き出力(ユーザー設定可能) )、最適化のための正規表現と文字列のヒートマップなど.

CPANで無料で利用可能: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm

8
Yves

このオンラインツールを使用して正規表現をデバッグします。

http://www.regextester.com/

しかし、ええ、それはRegexBuddyを倒すことはできません。

7
gfe

私は自分の目で正規表現をデバッグします。そのため、私は/x修飾子を使用し、それらにコメントを書き、それらを部分に分割します。 Jeffrey FriedlのMastering Regular Expressionsを読んで、高速で読みやすい正規表現を開発する方法を学んでください。さまざまな正規表現デバッグツールは、ブードゥー教のプログラミングを引き起こします。

6
codeholic

私に関しては、通常、任意の正規表現のバイトコードをダンプできる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
------------------------------------------------------------------
5
dark100

行き詰まっている場合は、後方に移動して、 txt2re を使用してサンプルテキストから直接正規表現を生成します(ただし、通常は結果の正規表現を手動で調整します)。

3
eggsyntax

私が使う:

http://regexlib.com/RETester.aspx

Regex Heroを試すこともできます(Silverlightを使用):

http://regexhero.net/tester/

3

あなたがMacユーザーなら、私はこの1つに出くわしました:

http://atastypixel.com/blog/reginald-regex-Explorer/

無料で簡単に使用でき、一般的なRegExを理解するのに非常に役立ちました。

3
jayp

ActiveState Komodo に含まれるRx Toolkitを使用します。

2
Czechnology

私はよくRubyベースの正規表現テスター Rubular

また、Emacsでは M-x 再構築者

Firefoxには 便利な拡張機能 もあります

2
ocodo

PCREのような表記法を使用してreg exeを記述することは、アセンブラーを記述することに似ています。頭の中で対応する有限状態オートマトンを見ることができれば問題ありませんが、すぐに維持するのは難しくなります。

デバッガーを使用しない理由は、プログラミング言語でデバッガーを使用しない場合とほぼ同じです。ローカルの間違いは修正できますが、最初のローカルの間違いを引き起こした設計上の問題の解決には役立ちません。場所。

より反射的な方法は、データ表現を使用してプログラミング言語で正規表現を生成し、それらを構築するための適切な抽象化を行うことです。 Olin Shiverのスキーム正規表現表記法の紹介 は、これらのデータ表現の設計で直面する問題の優れた概要を示しています。

2
Charles Stewart
2
Skilldrick

私はしばしばpcretestを使用します-ほとんど「デバッガ」ではありませんが、テキストのみのSSH接続で動作し、必要な正規表現の方言を正確に解析します。などではありません.

一般に、正規表現デバッガーを必要とするのがコードの匂いである上記の人に同意します。私にとって正規表現の使用に関して最も難しいのは、通常、正規表現自体ではなく、それらを機能させるために必要な複数層の引用です。

2

これを試すことができます http://www.pagecolumn.com/tool/regtest.htm

1
Eugeniu Torica

私にとっては、正規表現を目撃した後(私はかなり流fluentで、ほぼ常に/ xまたは同等のものを使用します)、退化したマッチング(過度にバックトラックするもの)をヒットするかどうかわからない場合、テストするのではなくデバッグすることがありますたとえば、演算子の貪欲さを変更することでそのような問題を解決できるかどうかを確認します。

それを行うには、上記の方法のいずれかを使用します:pcretest、RegexBuddy(私の現在の職場がライセンスを取得している場合)、または同様のもの。C#正規表現で作業している場合、時々Linqpadで時間を計ります。

(Perlのトリックは私にとって新しいものなので、おそらくそれを正規表現ツールキットにも追加するでしょう。)

0
ChrisF