どのように正規表現をデバッグしますか?[閉まっている]


149

正規表現は非常に複雑になる可能性があります。空白がないと読みにくくなります。デバッガーで正規表現をステップ実行できません。では、エキスパートは複雑な正規表現をどのようにデバッグするのでしょうか。


2
正規表現の「テスト」は、「デバッグ」よりもはるかに重要だと思います。通常、結果を見て簡単に(または回答で提案されたツールの1つを使用して)正規表現で何が起こっているのかを理解できますが、すべての可能なボーダーケースで正規表現をテストする必要があるということを確実に実行します。テストを行うと、最終的に何をしたいのかが明確になり、デバッグが役に立たなくなります:)
baol

7
これは興味深いようです:http :
//www.debuggex.com/

Visual Studioを使用している場合は、問題のある領域の近くにブレークポイントを設定できます(例:RegEx.Replace(...)「イミディエイトウィンドウ」に切り替え、いくつかの'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)コマンドを試して問題をすばやくゼロにする
DeepSpace101

2
私は非常に驚いて、誰も言及しているように見えるんだregex101.comを持っている実際のデバッガをし、同様にウェブホスティングされています。
mechalynx 2017年

1
2017年でさえ、regexbuddyは私が見つけることができる最高のツールであり、価格は$ 40のままです。私はしばしば異なる正規表現フレーバーで異なる言語で作業するため、しばしば混乱します。regexbuddyを使用すると、構文から解放されます
code4j

回答:


68

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

代替テキスト

また、開発者によれば、このツールをLinuxでWINEと一緒に使用すると、ほぼ完璧に動作します


31
残念ながら、それはWindows専用であり、価格は40米ドルです。
kennytm

25
開発者によると、WINEXを介してLinux上で実行されます:regexbuddy.com/wine.html。そして40ドルのコストについて...あなたの時間はどれくらいの価値がありますか?
Mick

18
これはフリーソフトウェアではありません。
codeholic、

38
誰が言ったのか、それを求めたのか?
Tim Pietzcker、2010

21
まあ、ミックが言ったように、あなたの時間はどれくらいの価値がありますか?「お金で買える最高のツール」は必ずしもお金がかかるわけではありませんが、時々お金がかかります。さらに、JGSoftは、卓越したユーザーサービスを提供する優れた品質の製品を一貫して開発しています。それらをサポートしてビジネスを続けたいので、私は本当に必要のないソフトウェア(RegexMagicなど)も購入しました。あなたは何が欠けているのか分かりません。真剣に。
Tim Pietzcker、

52

Perl 5.10では、use re 'debug';。(またはdebugcolor、しかし、スタックオーバーフローで出力を適切にフォーマットできません。)

$ perl -Mre = debug -e '"foobar" =〜/(。)\ 1 /'
REx "(。)\ 1"をコンパイルしています
最終プログラム:
   1:OPEN1(3)
   3:REG_ANY(4)
   4:クローズ1(6)
   6:REF1(8)
   8:終了(0)
ミンレン1
REx "(。)\ 1"を "foobar"と照合します
   0 <> <foobar> | 1:OPEN1(3)
   0 <> <foobar> | 3:REG_ANY(4)
   1 <f> <oobar> | 4:CLOSE1(6)
   1 <f> <oobar> | 6:REF1(8)
                                  失敗しました...
   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"

また、あなたがすることができ、それらをより読みやすくするために正規表現に空白やコメントを追加します。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", ...);

12
+1:なぜだれもこれよりもRegexbuddyを好むのでしょうか。
Charles Stewart

1
私はこの方法が好きですが、正規表現のバディの方が良いと思います。
2010

エコー "foobar" | egrep "(。)\ 1"
DmitrySandalov

30

忘れないようにもう1つ追加します:debuggex

それは非常に視覚的であるので良いです: Debuggex正規表現ヘルパーの写真


debuggexは実際には機能しません。フォントがJavaScriptによって強制されているようで、機能しません(私は等幅フォントを使用しており、Firefoxコンソールでは完全に使用されます)。結果として、ディスプレイは使用できなくなります。さらに、JavaScriptテストでは、すべてのエディションに対して(起動時に一度だけではなく)多くのテストケースでブラウザーがハングします。最後に、提案された正規表現の一部にバグがあり、意図したとおりに一致しません。
7heo.tk

28

私が正規表現に行き詰まったとき、私は通常これに目を向けます:https : //regexr.com/

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


1
このツールは本当に便利です。インストールは不要、リアルタイムで実行できるため、デバッグは夢であり、何かを思い出せない場合に備えて、便利なツールチップと特殊文字のリストさえあります。それは完璧です、たくさんありがとう
Jason Ridge

残念ながら、このツールでは(依然として)正規表現の区切り文字を(PCREエンジンの場合でも)変更することはできません/。これらは(スラッシュ)として修正されています。これは私にとってはすごいです。
MrWhite

19

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

Kodosは、Pythonプログラミング言語の正規表現を作成、テスト、デバッグするためのPython GUIユーティリティです。Kodosは、開発者がPythonで効率よく簡単に正規表現を開発できるように支援する必要があります。Pythonの正規表現の実装はPCRE標準に基づいているため、KodosはPCRE標準に準拠している他のプログラミング言語(Perl、PHPなど)の開発者にもメリットがあります。

(...)

代替テキスト

Linux、Unix、Windows、Macで動作します。


2
Kodosは真のデバッグ機能を提供していません。正規表現をステップ実行したり、実行を一時停止したりすることはできません。
2011

Macで動作させるためのヒントはありますか?SourceforgeサイトではMacへのインストールに関する情報は提供されておらず、私のGoogle-fuで失敗しているようです。
アダムパーキン

これはPython2のように思われ、2006年(執筆時点で14年前)以降更新されていませんか?
MrWhite

13

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


4
おい、あなたはregexbuddyのスクリーンショットを見た後にこれを投稿しましたか?
2010

2
誰もがこれに反対するでしょうが、それは悪い考えではありません。誰もが、正規表現エンジンは巨大な正規表現で最も効率的であると想定しています。これは必ずしも本当であるとは限りません、そしてそれらは間違いなく読みにくいです。正規表現を分割します。
Dan Rosenstark、2010

1
@マイケル・ブルックス:いいえ、前に、実際には。スクリーンショットを見て、私はあなたが正規表現をデバッグできるという事実で大丈夫です。しかし、私は自分の考えに立っています。正規表現が複雑になりすぎたときは、別の方法に変更するときです。
Valentin Rocher

12

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


8

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

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


OPは「デバッガーで正規表現を踏むことはできません」
クォンタム

プレゼンテーションへのリンクはありますか?
ルーク

3
@Rook、プレゼンテーションはyoutube.com/watch?v=zcSFIUiMgAsで
Starfish


6

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


5

私は通常、正規表現のバイトコードをダンプできる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
------------------------------------------------------------------


3

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




2

PCREのような表記法を使用して正規表現を作成することは、アセンブラを作成することに似ています。頭の中で対応する有限状態オートマトンを確認できれば問題ありませんが、すぐに保守するのが難しくなる場合があります。

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

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


パーサーのコンビネーターは確かにすばらしい方法です:HaskellのParsecとPArrows、Rubyのrsec、C ++のBoost Spirit、PythonのPyParsing、PerlのPerl6 :: Rulesなど
ephemient

2

私はしばしばpcretestを使用します。「デバッガ」はほとんどありませんが、テキストのみのSSH接続で機能し、必要な正規表現の方言を正確に解析します。私の(C ++)コードはlibpcreにリンクしているため、魔法や内容の微妙な違いに問題はありません。等ではない

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





0

私にとっては、正規表現に目を向けた後(私はかなり流暢で、ほとんどの場合/ xまたは同等のものを使用します)、一部の縮退した一致(つまり、過度にバックトラックするもの)にヒットするかどうかわからない場合は、テストするのではなくデバッグします。たとえば、オペレーターの貪欲さを変更することで、このような問題を解決できるかどうかを確認します。

これを行うには、pcretest、RegexBuddy(現在の職場でライセンスされている場合)などの上記の方法のいずれかを使用します。C#正規表現で作業している場合は、Linqpadで時々測定します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.