0

申し訳ありませんが、私はグーグルでコードを動作させることができません。正確にはJavaを使った気まぐれではありません(まだですが、時間をください:-))。DOMパーサーを使用してクラス属性を読み取り、抽出しているxmlドキュメントがあります。次に、正規表現を使用してこれらの属性の一部を除外する必要があります。たとえば、これまでの私の出力は次のとおりです。

[[#text: ns1:Spare3]]

[[#text: ns1:Spare4]]

[[#text: ns1:Spare5]]

[[#text: ns1:Street]]

[[#text: ns1:Anything]]

[[#text: ns1:TearLineDateUpdated]]

[[#text: ns1:SourceReportTearline]]

[[#text: ns1:AnyFilter]]

[[#text: ns1:UpdatedByTelecom]]

[[#text: ns1:UpdatedByName]]

単語を含む行を除外するか、 (大文字と小文字を区別しない)他のいくつかの行でSpare始める必要があります。TearLine

私のコードスニペット(私がテストするために書いたもの)は次のように述べています:

Pattern p = Pattern.compile(".*?\\Spare\\(.*?\\)",    
Pattern.CASE_INSENSITIVE|Pattern.DOTALL | Pattern.MULTILINE);
Matcher m = p.matcher((nl.item(i)).toString());
if (m.matches())
{
System.out.println("["+nl.item(i)+"]" + "matched"); 
}
else
{
System.out.println("["+nl.item(i)+"]" + "not matched");     
}

Spare単語を含む行とで始まる行を除外するにはどうすればよいですかTearLine(ただしTearLine、単語の他の場所で発生する可能性があり、それで問題ありません)。

4

5 に答える 5

1

それらはあなたが一致させようとしている実際の文字列ですか?つまり、DOMパーサーがそれらの文字列を生成し、今、それらに正規表現を適用していますか?もしそうなら、あなたはこのようなものが欲しいです:

Pattern p = Pattern.compile(
    "ns1:(tearline|.*spare)", Pattern.CASE_INSENSITIVE
);
Matcher m = p.matcher("");

String[] inputs = {
    "[[#text: ns1:Spare3]]",
    "[[#text: ns1:Spare4]]",
    "[[#text: ns1:Spare5]]",
    "[[#text: ns1:Street]]",
    "[[#text: ns1:Anything]]",
    "[[#text: ns1:TearLineDateUpdated]]",
    "[[#text: ns1:SourceReportTearline]]",
    "[[#text: ns1:AnyFilter]]",
    "[[#text: ns1:UpdatedByTelecom]]",
    "[[#text: ns1:UpdatedByName]]"
};

for (String s : inputs)
{
  System.out.printf( "%n%5b => %s%n", !m.reset(s).find(), s );
}

出力:

false => [[#text: ns1:Spare3]]

false => [[#text: ns1:Spare4]]

false => [[#text: ns1:Spare5]]

 true => [[#text: ns1:Street]]

 true => [[#text: ns1:Anything]]

false => [[#text: ns1:TearLineDateUpdated]]

 true => [[#text: ns1:SourceReportTearline]]

 true => [[#text: ns1:AnyFilter]]

 true => [[#text: ns1:UpdatedByTelecom]]

 true => [[#text: ns1:UpdatedByName]]

ノート:

  • find()代わりに使用したmatches()ので、正規表現は文字列全体ではなく、関心のある部分にのみ一致する必要があります。

  • 他のレスポンダーの中には、^TearLine単語を行の先頭に表示する必要があると言ったために使用したものもありますが、私の推測が正しければ、ns1:プレフィックスの直後に一致させる必要があります。一方、最初だけでなく、どこにでも表示.*spareできます(機能します)。spare.*?spare

  • 同様に、Ωmegaは、完全な単語"\\bSpare\\b"にのみ関心があるという前提で使用されました。または(推測している)のようなものに一致させたいように思われるので、境界()という単語を省略しました。Spare\bSpare3FooSpare

  • \\(.*?\\)サンプル文字列に括弧がなかったため、正規表現に追加した理由がわかりません。

于 2012-10-20T14:17:12.507 に答える
1

これらすべてのコード行を使用してもかまいません。以下に基づいたこの単純な1つのライナーを使用してString.matches()ください。

if (nl.item(i).toString().matches("(?i)(?s).*ns1:(spare|tearline).*")) {
    // not matched
else {
    // matched
}

fyi(?i)は、正規表現の大文字と小文字を区別せず(?s)、の正規表現ですPattern.DOTALL

于 2012-10-20T10:32:58.743 に答える
0

正規表現パターンを使用する

^(?:TearLine.*|.*\\bSpare\\b)
于 2012-10-19T23:20:10.167 に答える
-1

あなたはおそらく最初のバックスラッシュを取り除きたいでしょう

".*?Spare\\(.*?\\)"

\S空白以外のものと一致するためです。

もう1つは、正規表現が次のようになっている必要があります。

"ns1:tearline.*"
于 2012-10-19T23:15:18.117 に答える
-1

TearLineで始まる行を一致させるには:

^TearLine

スペアを含む行を一致させるには:

Spare

それらを1つの式に組み合わせるには:

(?:^TearLine)|(?:Spare)
于 2012-10-19T23:17:58.137 に答える