2016-08-30 4 views
0

私は次のJavaScriptの正規表現を持っている:非貪欲の後方JavaScript正規表現?

のような文字列に適用される
/\!\[(.*?)\]\((.+?) \"(.*?)\"\)/g 

:私がいる問題は、4つの異なる値下げがなければならないということである

![test](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png)<br />![test](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "test")<br />![test](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png)<br />![test](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "test") 

regex101 link

タグのうちの2つが一致するはずですが、戻ってくる2つの一致はマークダウンタグを含みます。

これは、最初の可能な試合の開始点をつかんで、後で可能な開始点がマッチ内にあるかどうかにかかわらず試合の残りの部分を探し続ける正規表現パーサに沸騰しているようです。私は非貪欲な?修飾子でこれを回避できると思ったが、そうではないようだ。

提案がありますか?

答えて

1

Markdownリンクの2つには説明がありませんが、説明は正規表現ではオプションではありません。

/\!\[(.*?)\]\((.+?)(?: \"(.*?)\")?\)/g 

(あなたが堅牢性を必要とする場合は、既存のマークダウンパーサーを使用する必要がありますが)、このような意図しない長いマッチを避けるために、リンクアドレスの一部に特定の文字を除外した方がよいかもしれません。

/\!\[(.*?)\]\(([^)]+?)(?: \"(.*?)\")?\)/g 
+0

申し訳ありませんが、第二の発現が実際にあります: '' /\!\[(.*?)\]\((.+?)\)/それが関連していないようでした。私は既存のパーサを使用したいと思いますが、それらのどれも私が持っているすべての要件(標準的なもの、例えばリンクや書式、混合ul/olとolの型、脚注/参照、数学記号と方程式のネストリスト、コードタグはインラインとブロックの両方の形式とネストされたリスト内など)。ほとんどのコードはコード化されていますが、このコードは私に問題を与えています。 – CoryG

+0

また、有効なURL文字であるためかっこを制限する必要はありませんが、それは希望的な考えかもしれません。 – CoryG

+0

正規表現のトップバージョンのURLコンポーネントを、[here](https://gist.github.com/hansifer/32bcba48c24621c2da78)のURLマッチャーから「^」を差し引いたものに置き換えたので、これを正しいとマークしていただきありがとうございます最後に '$'を開始すると、それは私がそれに投げるすべてでうまくいきます。 [例](https://regex101.com/r/aN3yD1/1)。 – CoryG