1

私は正規表現が初めてです。以下のシナリオの正規表現を書くことに感銘を受けました。誰かがこれを解決するのを手伝ってくれますか?

次のような文字列がある場合:

<Tag1 attr="test"/>
<Tag2>
    <Tag4 attr="test"/>
    <Tag5 attr="test"/>
</Tag2>
<Tag3 attr="test"/>

<Tag2> タグと </Tag2> タグの間の「test」に一致する正規表現は何ですか?

出力は、Tag4 と Tag5 の両方で「test」と一致する必要があります...

どんな助けでも大歓迎です..

4

4 に答える 4

1

なぜこれに正規表現を使用しているのですか?私はJavaライブラリに精通していませんが、XPathを使用してXQueriesを実行できるライブラリがあると思います。それがより簡単なアプローチです。

これが例を示すウェブサイトです

これがJavaのXPathに関するSOの質問です

于 2012-06-20T14:24:27.493 に答える
1

これには XPath の方が適しています。これは重複投稿のようです。 オリジナル

Perl には、CPAN に関する優れた xpath パーサーがいくつかあります。ただし、絶対に使用する必要がある場合は、複数行の正規表現解析に関する優れたページを次に示します。

于 2012-06-20T14:29:03.933 に答える
0

前に述べたすべては完全に真実です-しかし、まだいくつかの正規表現を練習したい場合は、別の方法があります:内部グループの1つが常に破棄されるため(これを参照)、1つの一致でそれを行うことはできません。したがって、抽出する必要があります最初に内側の通路。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTagParse {

static String html = "<Tag1 attr=\"test\"/><Tag2>    <Tag4 attr=\"test_one\"/>    <Tag5 attr=\"test_two\"/></Tag2><Tag3 attr=\"test\"/>";

public static void main(String[] args) {
    Matcher mat1 = Pattern.compile("Tag2>(.*)</Tag2").matcher(html);
    mat1.find();

    Matcher mat2 = Pattern.compile("<[^<>]*attr=\"([^\"]+)\"[^<>]>").matcher(mat1.group(1));
    while(mat2.find()){
        System.out.println(mat2.group(1));
    }
}

}

とにかく、XPathを使用したほうがはるかに良いでしょう:)

于 2012-06-20T15:22:23.690 に答える
0

私はJavaの練習はしていませんが、正規表現のガイダンスを提供できるといいのですが。探している特定の属性と値がわかっている場合は、次のようなものを使用できます。

Pattern pattern = Pattern.compile("<tag[45].*attr\s*=\s*[\"']test['\"][^>]*>", Pattern.CASE_INSENSITIVE);

Matcher matcher = pattern.matcher("<Tag1 attr='test'/><Tag2><Tag4 attr='test'/><Tag5 attr='test'/></Tag2><Tag3 attr='test'/>");

matcher.matches();

正規表現は、次のコンポーネントで構成されています。

リテラル文字列と一致します:

4または5のいずれかが続きます([45]指定)

リテラル文字列の前に任意の数の文字が続きます:attr

その後に任意の数のスペースが続きます

リテラル文字が続く:=

その後に任意の数のスペースが続きます

'または"文字が後に続く

文字列リテラルが続く:test

'または"文字が後に続く

>以外の文字が続く

続いて>

これらの余分なビットのいくつかを追加するポイントは、さまざまなコーディングスタイルなどを考慮する必要がある/検討する必要があることを強調することです。注:パターンを大文字と小文字を区別しないように設定することで簡単に削除できましたが、省略できます。そして、式を変更して適切な大文字と小文字をチェックします(たとえば、属性値で大文字と小文字が区別される場合は、「tag」リテラルを[tT] [aA] [gG]に変更して、タグとの一致を許可できます。大文字と小文字を区別しません。

jvatamanがすでにあなたの質問に答えているので、私は明らかに入力するのが遅すぎますが、おそらく私の記事には何らかの価値があるので、とにかく投稿します。

于 2012-06-20T15:25:19.057 に答える