5

これは私のテスト文字列です:

<img rel="{objectid:498,newobject:1,fileid:338}" width="80" height="60" align="left" src="../../../../files/jpg1/Desert1.jpg" alt="" />

JSON 形式の各要素を rel 属性の間に取得したいと考えています。最初の要素 (objectid) に対して機能しています。

これが私の ReqEx で、正常に動作します。

(?<=(rel="\{objectid:))\d+(?=[,|\}])

しかし、私はこのようなことをしたいのですが、うまくいきません:

(?<=(rel="\{.*objectid:))\d+(?=[,|\}])

したがって、検索文字列のすべての要素を解析できます。

私はJava-ReqExを使用しています

4

3 に答える 3

2

Java (および .NET と JGSoft を除くほぼすべての正規表現) は、後読み内での無限の繰り返しをサポートしていません。

代わりにキャプチャ グループを使用できます。また、[^{]*の代わりに使用し.*、 で単語の境界を確保して\bください。

rel="\{[^{]*\bobjectid:(\d+)

で十分なはずです (次に、キャプチャ グループ 1 で属性の値を確認します。

于 2010-04-21T14:09:47.913 に答える
1

すべてのキーと値のペアを反復処理しますか? そのために後読みは必要ありません。

String s = 
    "<img rel=\"{objectid:498,newobject:1,fileid:338}\" " +
    "width=\"80\" height=\"60\" align=\"left\" " +
    "src=\"../../../../files/jpg1/Desert1.jpg\" alt=\"\" />";
Pattern p = Pattern.compile(
    "(?:\\brel=\"\\{|\\G,)(\\w+):(\\w+)");
Matcher m = p.matcher(s);
while (m.find())
{
  System.out.printf("%s = %s%n", m.group(1), m.group(2));
}

初めてfind()呼び出され、正規表現の最初の部分が一致しrel="{ます。後続の呼び出しでは、2 番目の選択肢 ( \G,) が引き継ぎ、カンマに一致しますが、それは前の一致の直後に続く場合に限られます。(\w+):(\w+)どちらの場合でも、次のキーと値のペアに一致するように並んでおり、rel属性の外側のどこにも一致することはありません。

HTMLファイル全体ではなく、投稿したように、正規表現を孤立したIMGタグに適用していると思います。また、正規表現は、実際のデータと一致するように少し調整する必要がある場合があります。たとえば、([^:]+):([^,}]+)ではなく、より一般的な が必要な場合があります(\w+):(\w+)

于 2010-04-21T14:58:50.783 に答える
0

一般に、先読みと後読みには任意の正規表現を含めることはできません。ほとんどのエンジン (Java を含む) では、長さが既知である必要があるため*、それらのような量指定子を使用することはできません。

とにかく、なぜここで先読みと後読みを使用しているのですか? 代わりにキャプチャ グループを使用するだけで、はるかに簡単になります。

rel="\{.*objectid:(\d+)

これで、最初のキャプチャ グループに ID が含まれます。

于 2010-04-21T14:09:08.690 に答える