2017-02-18 4 views
1

これは、HTMLのインラインCSSスタイルプロパティの解析についてです。私はJSoupを使用していますが、これまでJSoupがこれを手伝っていないことを確認できていれば...理由はわかりません。これは、ユーザーがキーや値などの正当な文字のルール、つまり「正しく形成された」CSSスタイルの属性を構成するもの(正確な用語であっても正しいものであることを意味するもの)を見つける必要があることを意味します(: !style "properties"、CSSParserによる])。regex way to say "セミコロンまたは文字列の終わりのいずれか"

とにかく、個々のキーと値のペアを抽出する際に、セミコロンで区切るのですが、末尾のセミコロンはオプションです。しかし空白を許すと、文字列の最後で終了します。

だから私はこれを試してみました:

Pattern styleSubattrsPattern = Pattern.compile("([A-Za-z0-9-]+)\\s*:\\s*([A-Za-z0-9-]+)\\s*[$;]"); 

...「セミコロンまたは文字列のどちらかの端部」を意味することを意図。しかし、それは動作しません:最終的なキーと値のペアは一致しません。

後で

根本的な問題は、実際にCSSParserを使用することによって解決しました。 []内の特殊文字を囲むこと(逆試合のため、開始時^を除く)リテラル文字を代わりに参照するよう[$;]を使用して

+0

'([^;?! ]) '' 'にマッチさせたくない場合は、このトリックを行うべきである(それは、'; '*ではない文字が続くことを意味する*) –

+0

面白そうだ... Tx説明のために...ちょうど私の頭の周りを取得しようとしているで! –

+0

実際、イタリック体のフレーズは、必要なものを正確に要約しています...おそらく、ブラウザのアルゴリズムがこれを解析する方法に対応しています。 –

答えて

2

は、セミコロンまたはドル記号のいずれかと一致します。あなたはおそらく欲しい

はこれです:;?$:また((;)|($))

あなたはセミコロンの後に行末を期待するならば、あなたはまた、任意の文字を表すために疑問符を使用することができます。

+0

優秀な...説明のおかげで。もちろん、*最後の末尾の*セミコロンはもちろんオプションです:実際には '((??)|($))'を入れました。 –

+0

問題はありません@mikerodent、それはあなたのためにどのように動作するか教えてください。 – Tyzoid

+0

PS * *実際にはあなたは内側の括弧は必要ありません:これはOK: '(;?| $)'のように見えます。 –

1

あなたは否定先読みアサーション否定文字クラス使用してそれを行うことができます。これは、2つのケースを扱う(?![^;])

を:

  • の文字がありますならば、この1つは唯一;することができ
  • 文字列の最後(文字なし)のみが許可されます。

ので:

Pattern styleSubattrsPattern = Pattern.compile("([A-Za-z0-9-]+)\\s*:\\s*([A-Za-z0-9-]++)\\s*+(?![^;])"); 

(私はバックトラック禁止と無用のテストを避けるために、所有量指定子を追加しました:* =>*++ =>++

+0

これは過度に複雑な方法のように思えます。試合の一部となる。 –

+0

これが複雑だと思えば、それを避けるために20行のコード行を書いてください。 –

関連する問題