正規表現は非常に複雑になる可能性があります。空白がないと読みにくくなります。デバッガーで正規表現をステップ実行できません。では、エキスパートは複雑な正規表現をどのようにデバッグするのでしょうか。
RegEx.Replace(...)
「イミディエイトウィンドウ」に切り替え、いくつかの'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)
コマンドを試して問題をすばやくゼロにする
正規表現は非常に複雑になる可能性があります。空白がないと読みにくくなります。デバッガーで正規表現をステップ実行できません。では、エキスパートは複雑な正規表現をどのようにデバッグするのでしょうか。
RegEx.Replace(...)
「イミディエイトウィンドウ」に切り替え、いくつかの'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)
コマンドを試して問題をすばやくゼロにする
回答:
RegexBuddyを購入し、その組み込みデバッグ機能を使用します。1年に2回以上正規表現を使用する場合、このお金は時間を節約して時間を節約できます。RegexBuddyは、単純および複雑な正規表現を作成し、さまざまな言語でコードを生成するのにも役立ちます。
また、開発者によれば、このツールをLinuxでWINEと一緒に使用すると、ほぼ完璧に動作します。
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", ...);
私が正規表現に行き詰まったとき、私は通常これに目を向けます: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
------------------------------------------------------------------
あなたがMacユーザーなら、私はこれに出くわしました:
http://atastypixel.com/blog/reginald-regex-explorer/
これは無料で、使い方も簡単で、RegExを一般的に理解するのに非常に役立ちました。
PCREのような表記法を使用して正規表現を作成することは、アセンブラを作成することに似ています。頭の中で対応する有限状態オートマトンを確認できれば問題ありませんが、すぐに保守するのが難しくなる場合があります。
デバッガーを使用しない理由は、プログラミング言語でデバッガーを使用しない場合とほとんど同じです。ローカルミスを修正できますが、最初にローカルミスをする原因となった設計上の問題の解決には役立ちません。場所。
より反映的な方法は、データ表現を使用してプログラミング言語で正規表現を生成し、それらを構築するための適切な抽象化を行うことです。 Olin Shiverのスキーマ正規表現表記の紹介は、これらのデータ表現の設計で直面する問題の優れた概要を提供します。
私はしばしばpcretestを使用します。「デバッガ」はほとんどありませんが、テキストのみのSSH接続で機能し、必要な正規表現の方言を正確に解析します。私の(C ++)コードはlibpcreにリンクしているため、魔法や内容の微妙な違いに問題はありません。等ではない
一般的に私は、正規表現デバッガがコードの匂いである上記の人に同意します。私にとって、正規表現の使用に関して最も難しいのは、通常、正規表現自体ではなく、それらを機能させるために必要な複数の層の引用です。
私はActiveState Komodoに含まれているRxツールキットを使用しています。
これを試すことができ ますhttp://www.pagecolumn.com/tool/regtest.htm
私にとっては、正規表現に目を向けた後(私はかなり流暢で、ほとんどの場合/ xまたは同等のものを使用します)、一部の縮退した一致(つまり、過度にバックトラックするもの)にヒットするかどうかわからない場合は、テストするのではなくデバッグします。たとえば、オペレーターの貪欲さを変更することで、このような問題を解決できるかどうかを確認します。
これを行うには、pcretest、RegexBuddy(現在の職場でライセンスされている場合)などの上記の方法のいずれかを使用します。C#正規表現で作業している場合は、Linqpadで時々測定します。
(perlトリックは私にとって新しいものなので、おそらくそれを私の正規表現ツールキットにも追加します。)