2016-12-22 11 views
4

私はRegExベースのMarkdownパーサーを構築しています。リファレンススタイルのリンクラベルを探すためにRegExに取り組んでいる間、私はRegExのバグに遭遇しましたが、問題は見えません。なぜこの正規表現は数字と一致しないのですか?

次Markdownを考える:

[me]: http://example.com 
[her]: http://somewhere.com 
[1]: http://nhs.net 
[2]: http://test.com 
[google it]: http://google.com 

そして、この正規表現:私だけを検出することができるように思わ

\[(\w+\s?+\w+)\] 

[私]、[自分]と[それをグーグル]ではなく、ラベル[1]と[2]。 \wは英字と数字の両方を検出すると思ったのですか?

編集:はPCRE正規表現パーサーを使用して

+0

ICU、PCRE、JSのいずれかを使用している正規表現のフレーバーを共有できれば素晴らしいと思います。他の? –

+0

状態がPCRE – Garry

+1

に更新されました。私の代わりの提案では、PCREの '['と ']以外の文字にマッチする' '' '' '' '' '' –

答えて

3

\w+\s?+\w+パターンがあるため2つの\w+サブパターンの少なくとも2つの単語の文字と一致します。

オプションの空白で区切られた単語(複数可)を一致させたい場合は、regex demo

詳細を参照してください

\[(\w+(?:\s+\w+)*)\] 
     ^^^^^^^^^^^ 

を使用します。

  • \[ - オープニング[
  • (\w+(?:\s+\w+)*) - グループ1:
    • \w+ - 1+ワード文字
    • (?:\s+\w+)* - のゼロ以上の配列:
      • \s+ - 1以上の空白(あなたが?を使用している場合、1または0の出現がマッチしてしまいます)
      • \w+ - 1+ワード文字
  • ] - ]を閉じると

代替正規表現(エスケープは必要ありません) - あなたは[]がワード文字で始まる/続いていることを確認する必要がある場合は、使用

\[\b([^\][]+)\b] 

\[\bがと一致する場合、([^\][]+)[および]\b]以外の1+文字をキャプチャし、word charの後に]と一致します。 あなたが\w+と1+文字と第二\w+を持つ別の1+文字を期待しているためregex demo

+1

パーフェクト。パターンについてはこれまで以上に説明してくれてありがとう。 RegExは非常に強力ですが、パターンは理解しやすいナットです! – Garry

0

あなたの正規表現は、これら二つの数値と一致していません参照してください。だから少なくとも2文字

さらに、あなたの\s?+はちょっと変わっています。つまり、オプションの空白が必要ですが、それは1回以上です。

+0

彼は確かに、それはちょうど奇妙です。 https://regex101.com/r/Aw7mFr/1 – Fallenhero

+0

'\ s?+'についての説明は奇妙です。所有権のあるオプションの空白文字か構文エラーです。 –

関連する問題