問題タブ [oniguruma]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
regex - GFM で強調表示されたコード ブロックを Stack Overflow で強調表示されたコード ブロックに変換する
1. 質問
GFM で強調表示されたコード ブロックをStack Overflow で強調表示されたコード ブロック に変換できません。
2. 例
たとえば、次のように変換する必要があります。
に:
3.問題
強調表示されたコード ブロックを取得するには、コード ブロック内の各行の先頭にタブを追加する必要があります。どうすればいいのかわからない。
4.助けられなかった
私の正規表現の例:
検索:
/li>置換:
/li>
結果が得られます:
コード ブロック内の最初の行の先頭にのみ集計記号が追加されました。コードブロック内の各行の先頭にタブ記号を追加するにはどうすればよいですか?
regex - 正規表現の実装をバックトラックするための最適化手法
Ruby の正規表現アルゴリズムの探索でスケッチしたバックトラッキング アプローチに基づいて、正規表現マッチャーを実装しようとしています。コンパイルされた正規表現は、仮想マシン コマンドの配列に変換されます。現在のコマンドと入力文字列インデックスのバックトラック、およびグループ情報の取得のために、スタックに保持されます。
In Regular Expression Matching: the Virtual Machine Approach Cox は、特定の正規表現コンポーネントを VM コマンドにコンパイルする方法について、より詳細な情報を提供していますが、議論されている実装は少し異なります。これらの記事に基づいて、私の実装は、標準のグループ化、文字クラス、繰り返しコンポーネントに対して非常にうまく機能します。
ここで、このタイプの実装にどのような拡張機能と最適化オプションがあるかを確認したいと思います。Cox は彼の記事で DFA/NFA アプローチに関する多くの有用な情報を提供していますが、バックトラッキング アプローチの拡張または最適化手法に関する情報は少し不足しています。
たとえば、彼が述べている後方参照について
バックトラッキングの実装では、後方参照は簡単です。
DFA アプローチのアイデアを提供します。しかし、VM アプローチを使用してこれを「自明」に行う方法は明確ではありません。backreference コマンドに到達したら、以前に一致した文字列を対応するグループから VM コマンドの別のリストにコンパイルし、何らかの方法でそれらのコマンドを現在の VM に組み込むか、2 番目の VM を維持して一時的にその VM に実行を切り替える必要があります。
彼はまた、先読みを使用して繰り返しを最適化する可能性についても言及していますが、それがどのように機能するかについては詳しく説明していません。これは、バックトラッキング スタックのアイテム数を減らすために使用できるように思えます。
tl;dr VM ベースのバックトラッキング正規表現の実装には、どのような一般的な最適化手法が存在し、どのように機能しますか? 特定のプログラミング言語に固有の最適化を探しているのではなく、このタイプの正規表現実装の一般的な手法を探していることに注意してください。
編集:最初のリンクで述べたように、鬼車ライブラリは、まさにそのスタックベースのバックトラッキング アプローチを使用して正規表現マッチャーを実装しています。おそらく、他の実装に一般化できるそのライブラリによって行われた最適化について誰かが説明できるでしょう。残念ながら、ライブラリはソース コードに関するドキュメントを提供していないようで、コードにもコメントがありません。
編集 2:構文解析式文法 (PEG) について読んでいるときに、同様の VM ベースのアプローチを利用するLua PEG 実装に関する論文を見つけました。この論文では、実行される VM コマンドの数とバックトラッキング スタックの不必要な増加を減らすためのいくつかの最適化オプションについて言及しています。
regex - 「/」が前にある文字のすべてのインスタンスに一致
たとえば、私は文字列を持っているかもしれません
そして、すべての 'e' に一致させたいのですが、"zombie nimblezombie quick" というフレーズからのみ一致させたいと思います。これは、前にスラッシュがあるためです。
スラッシュが前にある文字列の内容は、かなり簡単に取得できます\/.*。
正しい文字列の「e」の最初のインスタンスを次のように一致させることもできます\/.*?\Ke
しかし、VSCode 構文の強調表示に適した方法で、正しい文字列内の 'e' のすべてのインスタンスを一致させたいと考えています。これは .NET フレーバーです。
-混雑する
regex - 鬼車正規表現条件付きグループキャプチャ
Oniguruma 正規表現 (VSCode 構文の強調表示用) を使用して、前の文字であるfunctionかどうかに応じて 2 つの異なるグループに単語をキャプチャしようとしています。::私の知る限り、鬼車は条件をサポートしていないため、文字が存在しない場合は正規表現の結果をグループ 1 に、存在する場合はグループ 2 にキャプチャできると考えました。
現在、私は以下を持っています:
コードをテストするテキスト:
意図した正規表現の一致
上記のテキストを考えると、グループ$1はすべきです
一方、グループ $2 は
私が理解している限り、次の意味は次のとおりfunctionですfunction。regex101.com によると、https://regex101.com/r/VtgeTD/1が機能するはずですが、構文の強調表示はまだ失敗しています。私は何か間違ったことをしていますか?