53

文字列がこの予測形式の場合:

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[^>]*>

意味
タグオープンサインを見つけてください。
スペースを許可します。単語
a を見つけます。 非終了タグを許可します。 「class(任意のスペース)=(任意のスペース)」を検索 します。次のいずれかの開始引用符を取得します:("または'または\"または\')。 Alan Mooreの回答から:冒頭の引用符以外の文字を許可します。 クラス名を検索 開始引用符以外の文字を許可します。 オープニングと同じクロージングクォートを見つけます。 uncloseing-tag文字を許可します。 終了タグcharを見つけます。









4

6 に答える 6

76

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

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

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

于 2011-11-08T22:14:01.927 に答える
2

以下を使用できます。

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

見る

于 2011-11-08T19:08:36.957 に答える
2

何のために情報が必要なのかわからない場合 (または、実際にこの正規表現を使用している言語やツールさえわからない場合)、私が提案できる多くの方法があります。

これらの文字列の使用:

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 のいずれかです。最初 (または最後) の文字を取得することで、どのタイプの引用符が使用されているかを知ることができます。

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

このルートを使用したい場合や、もう少しサポートが必要な場合はお尋ねください

于 2011-11-08T19:56:55.077 に答える