2017-05-04 5 views
2

javascript regexpを使用して、"/foo"または"/foo d/"のような文字列を見つけたいと思いますが、"/foo /"ではなく、すなわち、「注釈文字」、終端注釈のない単語、または終端がフレーズの終わりに来る複数の単語(スペースなし)。状況を複雑にすると、可能な注釈シンボルは、/,\、および|です。私が何かしようとしたキャプチャグループを否定する方法は?

:ある

/(?:^|\s)([\\\/|])((?:[\w_-]+(?![^\1]+[\w_-]\1))|(?:[\w\s]+[\w](?=\1)))/g 

は、(注釈以外のもの)で、次に文字と注釈を踏襲していない単語、その後

  1. 、注釈、その後、スペースで始まります..または
  2. おそらく複数の単語、その直後に注釈文字が続きます。

問題は[^\1]です:これは山括弧で "注釈文字以外のもの"と読みません。

私は、アノテーション文字ごとに1つずつ、フレーズ全体を3回繰り返すことができました。どんな良いアイデアですか?

+1

ところで、「\ w」にはすでに「_」が含まれています。 –

+0

'[^ \ 1] +'の代わりに '。+?'を試し、次の注釈文字まで貪欲ではないものと一致させてください。 –

答えて

2

前述したように、[^\1]は機能しません。これは、文字1以外のものと一致します。 JavaScriptでは、先読みを使用して\1を無効にすることができます。(?:(?!\1).)*。これは効率的ではありませんが、機能します。あなたのパターンのように書くことができ

([\\\/|])([\w\-]+(?:(?:(?!\1).)*[\w\-]\1)?) 

Working example at Regex101

  • \wすでにアンダースコアが含まれています。
  • 代わりに(a|ab)私はオプションのグループ(a(?:b)?)を使用しています - 私たちは常に最初の単語とオプションの単語とタグを組み合わせます。
  • 最初に(?:^|\s)を含めることができます。
関連する問題