問題タブ [negative-lookbehind]

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.

0 投票する
1 に答える
1769 参照

java - Java RegEx API "後読みグループには、インデックス付近の明らかな最大長がありません..."

私はいくつかの SQL where 句の解析を行っており、.NET API を使用している「Rad Software Regular Expression Desginer」を使用して、文字列リテラルの外側の列を見つけるために動作する RegEx を設計しました。設計された RegEx が Java でも動作することを確認するために、もちろん API (1.5 および 1.6) を使用してテストしました。しかし、それはうまくいきません。メッセージを受け取りました

「後読みグループには、インデックス 28 付近に明らかな最大長がありません」。

解析しようとしている文字列は

ご想像のとおり、より複雑な SQL where 句で RegEx が失敗しないように、ある種の最悪のケースを作成しようとしました。

正規表現自体は次のようになります

もっと洗練された RegEx があるかどうかはわかりませんが (おそらく存在するでしょう)、それはトリックを実行するので、現時点では重要ではありません。

RegEx を簡単に説明すると、探している列が見つかった場合、列名が文字列リテラルで使用されているかどうかを判断するために、否定的な後読みが行われます。もしそうなら、それは一致しません。そうでない場合は一致します。

質問に戻ります。前述したように、Java では動作しません。何が機能し、私が望む結果になりますか?
私は、Java が無制限の後読みをサポートしていないように見えることを知りましたが、それでも動作させることができませんでした。
後読みが常に検索オフセットから現在の検索位置までに制限をかけているのは正しくありませんか? それで、「位置 - オフセット」のような結果になりますか?

0 投票する
3 に答える
391 参照

php - 可変幅のネガティブルックビハインド置換が必要

私はここで多くの質問(およびさらに多くのウェブサイト)を見て、いくつかはヒントを提供しましたが、どれも私に決定的な答えを与えませんでした。私は正規表現を知っていますが、教祖にはほど遠いです。この特定の質問は、PHPの正規表現を扱います。

特定のクラスのハイパーリンクで囲まれていないテキスト内の単語を見つける必要があります。たとえば、私は持っているかもしれません

2番目と3番目の象と照合する必要がありますが、最初の象とは照合する必要はありません(テストクラス「no_check」で識別されます)。ハイパーリンク内には、hrefやclass以外の属性が存在する可能性があることに注意してください。私は思いついた

これは正規表現テストソフトウェアでは美しく機能しますが、PHPでは機能しません。

どんな助けでも大歓迎です。正規表現を提供できないが、その必要性を回避するようなPHPコードロジックを見つけることができれば、私も同様に感謝します。

0 投票する
3 に答える
680 参照

php - PHP の否定後読みと貪欲な量指定子

正規表現を使用して URL を検索し、それに応じてリンクしています。ただし、既にリンクされている URL をリンクしたくないので、後読みを使用して URL の前に href があるかどうかを確認しています。ただし、PHP の先読みおよび後読みでは可変長量指定子が許可されていないため、これは失敗します。

一致の正規表現は次のとおりです。

この問題を回避する最善の方法は何ですか?

編集:

まだテストしていませんが、単一の正規表現でそれを行う秘訣は、PCRE でサポートされている正規表現内で条件式を使用することだと思います。次のようになります。

重要な点は、href がキャプチャされた場合、一致(?(1)^|)しないことが保証されている条件により、一致がすぐに破棄されることです。おそらく何か問題があります。明日テストします。

0 投票する
3 に答える
1869 参照

regex - 正規表現をより効率的にする

「!」、「?」を検索して、英文の終わりを判断しようとしています (おおよそのことです)。または「.」、ただし「.」の場合 Mr. や Dr. などの一般的な略語が前に付いていない場合のみ。

次の正規表現を少しでも効率的にする方法はありますか? おそらく、負の後読みをサイズの降順、またはアルファベット順でソートすることでしょうか?

これが私が今持っている正規表現です:

問題:

http://regex.powertoy.org/のサイトでは、「7 は 21044 個のプローブに一致 (終了)」と報告しています。単純な段落でさえ... 21044 という数字のとんでもないサイズは、否定的な後読みの数と密接に関係しているようです。

RegEx エンジンを通過するデータが数 GB あるため、RegEx エンジンの計算の複雑さを軽減しようとしています。

これを引き締める方法はありますか?否定的な後読みは本当にこれを達成するための最良/唯一の方法ですか? 代わりに先読みとしてそれを行う方法はありますか? 正規表現はこのタスクに不適切なツールですか?

編集: ActionScript または PHP の正規表現エンジンを使用できます。

編集:文間のスペースの数を数えることはできません。 本当!?はぁ。

最適化に関して、正規表現エンジンの内部の仕組みを理解していない場合は、回答しないでください。

前もって感謝します。

0 投票する
2 に答える
360 参照

php - 正規表現:http(s)でない限り、スキームを削除します。(ネガティブルックビハインドパターンをキャプチャします)

ここで正規表現がブラックアウトしています。ネガティブなバックビハインドパターンを再度キャプチャするにはどうすればよいですか?

://http / httpsでない限り、URIのスキーム(を含む)を削除しようとしています。途中ですが(または、下のパターンはコンパイルされていないと思っていました)、実際にネガティブパターンをキャプチャする方法を忘れました。

preg_replace( '~^(?<!https?)://~', '', $uri );

どうすればこれを行うことができますか?

0 投票する
5 に答える
377 参照

python - この正規表現が機能しない理由を説明していただけますか?

group(0)がスーパーマンと一致しないのはなぜですか?このルックアラウンドチュートリアルは次のように述べています。

(?<!a)bは、「a」が前に付いていない「b」と一致し、ネガティブルックビハインドを使用します

0 投票する
3 に答える
3968 参照

php - 負の後読み正規表現キャプチャの問題

メールアドレスの照合を試みますが、先頭に「mailto:」が付いていない場合のみです。私はこの正規表現を試します:

"/(?<!mailto:)[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/"

この文字列に対して: '<a href="mailto:someemail@domain.com">EMAIL</a> ... otheremail@domain.com '

私はキャッチだけを期待して'otheremail@domain.com'いますが、私はまた、'omeemail@domain.com'行方不明を参照してください's'。ここで何が問題なのだろうか。後読みアサーションの後に通常の正規表現を使用できませんか?

PHP での私の例全体は次のようになります。

ありがとうございました!

0 投票する
1 に答える
212 参照

python - 否定後読みの使い方

基本的に、特定のスタイルシートで青の色相を持つすべての 16 進数値を赤の色相に#00f変更しています (つまり、 #ff0000(私の関数は を除く 6 文字の 16 進数値を出力します#))。

16 進数の色に一致する正規表現を作成することは問題ではありませんでした (HTML の色名については気にしませんが、最終的rgbには , rgba,などの値を気にするかもしれませんhsb)。これが私が最終的に得たもの#(([0-9A-z]{3}){1,2})です。それは機能しますが、完全な証拠にしたいです。たとえば、誰かが#top有効な 16 進数値を持つフラグメント (つまり ) で背景画像を設定した場合、私はそれを変更したくありません。否定的な後読みを試みましたが、うまくいかないようです。を使って\B#(([0-9A-z]{3}){1,2})たのですが、「#」の前に単語の区切り(スペースなど)があるとURLの断片と一致します。これは私がトリックを行うべきだと思ったものですが、そうではありません: (?<!url\([^#)]*)#(([0-9A-z]{3}){1,2}).

デスクトップ バージョンのRegExrを使用して、次のスタイルシートでテストしています。

部分文字列にカーソルを合わせるたびに(?<!、RegExr はそれを「「 」に一致する否定的な先読みurl\([^#)]*」として識別します。バグがあるのでしょうか、それとも正規表現の調子が悪いだけですか? また、16 進数以外の目的で「#」が使用されるコンテキストは他にありますか?

編集: わかりました、早朝にプログラムすることはできません。その16進数の正規表現は#(([0-9A-Fa-f]{3}){1,2})

編集 2: わかりました。ほとんどの言語で静的な長さの後読みが必要であるという詳細を見逃していました。

0 投票する
2 に答える
438 参照

regex - 正規表現:否定的な後読みと否定の違い

regular-expressions.infoから:

\b\w+(?<!s)\b。これは間違いなくと同じではありません\b\w+[^s]\b。に適用するJon'sと、前者が一致Jonし、後者Jon'(アポストロフィを含む)が一致します。理由を理解するのはあなたに任せます。(ヒント:\ bはアポストロフィとsの間で一致します)。後者は、「a」や「I」などの1文字の単語とも一致しません。

理由を説明できますか?

\bまた、正確に何をするのか、なぜアポストロフィとアポストロフィが一致するのかを明確にできますsか?