web-dev-qa-db-ja.com

正規表現での後方参照の否定

文字列がこの予測された形式である場合:

value = "hello and good morning"

"(引用符)も '(一重引用符)になる場合があり、終了文字('または")は開始文字と同じになります。引用符の間の文字列を一致させたい。

\bvalue\s*=\s*(["'])([^\1]*)\1

(2つの\は=記号の近くにスペースを許可するためのものです)

最初の「キャプチャされたグループ」(最初の括弧のペア内)-開始の引用と一致する必要があり、 'または "のいずれかである必要があります。-最初のグループでキャプチャされたもの以外の任意の数の文字を許可することになっています。そして、私はグループ(囲み引用符)でキャプチャされた文字を期待します。

(必要な文字列は2番目のキャプチャグループでキャプチャする必要があります)。
ただし、これは機能しません。

これは:

\bvalue\s*=\s*(['"])([^"']*)["']

しかし、開始と終了の両方の引用符(二重または単一)が同じであることを確認したいと思います。


[〜#〜]編集[〜#〜]
基本的には、クラス属性に特定のクラス名が含まれているアンカーの開始タグを取得することでした。( ')または(( ")。

ここでのすべてのアドバイスに従って、私はパターンを使用しました:

<\s*\ba\b[^<>]+\bclass\s*=\s*("|'|\\"|\\')(?:(?!\1).)*\s*classname\s*(?:(?!\1).)*\1[^>]*>

意味
タグオープンの標識を見つけます。
スペースを許可します。
検索Word a。
非終了タグを許可します。
「クラス(任意のスペース)=(任意のスペース)」を検索
次のいずれかの開始引用符を取得します:( "または 'または\"または\')。
アランムーアの回答より:開始引用符以外の文字はすべて許可してください。
クラス名を見つける
開始引用符以外の文字を許可します。
最初と同じである最後の引用を見つけます。
閉じられていないタグ文字をすべて許可します。
終了タグ文字を見つけます。

45
Yuval A.

否定された文字クラスの代わりに、否定先読みを使用する必要があります。

\bvalue\s*=\s*(["'])(?:(?!\1).)*\1

(?:(?!\1).)*は一度に1文字を消費しますafter先読みにより、文字がキャプチャグループ(["''])と一致しないことが確認されました。文字クラスは、否定されているかどうかにかかわらず、一度に1文字にしか一致できません。正規表現エンジンが知る限り、\1は任意の数の文字を表すことができ、この場合\1には"または'のみが含まれることを納得させる方法はありません。 。したがって、より一般的な(読みにくい)ソリューションを使用する必要があります。

64
Alan Moore

以下を使用できます。

\bvalue\s*=\s*(['"])(.*?)\1

見る

3
codaddict

何のために情報が必要なのか(あるいは、この正規表現をどの言語やツールで使用しているのかさえわからない)ことを知らなければ、私が提案できるパスはたくさんあります。

これらの文字列を使用する:

value = "hello and good morning"
value = 'hola y buenos dias'
value = 'how can I say "goodbye" so soon?'
value = 'why didn\'t you say "hello" to me this morning?'
value = "Goodbye! Please don't forget to write!"
value = 'Goodbye! Please don\'t forget to write!'

この式:

"((\\"|[^"])*)"|'((\\'|[^'])*)'

これらの文字列に一致します:

"hello and good morning"
'hola y buenos dias'
'how can I say "goodbye" so soon?'
'why didn\'t you say "hello" to me this morning?'
"Goodbye! Please don't forget to write!"
'Goodbye! Please don\'t forget to write!'

先行する単一の\でエスケープすると、「他の」タイプの引用符または同じタイプの引用符のいずれかが許可されます。引用符で囲まれた文字列の内容は、グループ1または3のいずれかにあります。最初の(または最後の)文字を取得することで、どのタイプの引用符が使用されているかを理解できます。

これらのいくつかを特定のマッチグループに含める必要がある場合は、より具体的な例を挙げてください(機能しないはずのものが近くにあるように見えます)

このルートを使用したいのか、もう少し助けが必要かどうか尋ねてください

2
Code Jockey

この質問に答える 無視されたセットで数値参照を使用する方法?

これはこれとまったく同じものとしてマークされていたためです。

クラス内でキャプチャグループを実際に指定することはできません。
できることは、このように否定的なアサーションで文字を指定することです

(["'])((?:(?!\1)[\S\s])*)(\1)

拡大

 ( ["'] )                      # (1)
 (                             # (2 start)
      (?:
           (?! \1 )
           [\S\s] 
      )*
 )                             # (2 end)
 ( \1 )                        # (3)

元の投稿[^char]は通常、改行に一致します
も同様ですが、これはJavaScript(古いJS)なので、ドットは使用できません。
使用する [\S\s]代わりに、任意の文字に一致します。

2
x15