1

皆さん、私の脳は揚げられています。間違った境界を置き換えることで、境界が正しくないいくつかの EML を修正しようとしています。

--Boundary_([ArbitraryName])

より適切な行

--Boundary_([ArbitraryName])--

行、すでに正しいまま

--Boundary_([ThisOneWasFine])--

行だけ。私はメッセージ全体を文字列としてメモリ内に持っています (はい、それは醜いですが、これらを解析しようとすると JavaMail は死んでしまいます)、それに対して replaceAll を実行しようとしています。これが私が得ることができる最も近いものです。

//Identifie bondary lines that do not end in --
String regex = "^--Boundary_\\([^\\)]*\\)$";
Pattern pattern = Pattern.compile(regex,
    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
Matcher matcher = pattern.matcher(targetString);
//Store all of our unique results.
HashSet<String> boundaries = new HashSet<String>();
while (matcher.find())
    boundaries.add(s);
//Add "--" at the end of the Strings we found.
for (String boundary : boundaries)
    targetString = targetString.replaceAll(Pattern.quote(boundary),
        boundary + "--");

これには、有効なすべてを置き換えるという明らかな問題があります

--Boundary_([WasValid])--

との行

--Boundary_([WasValid])----

ただし、これは、交換を実行することさえできた唯一のセットアップです。Pattern.quote(boundary) を Pattern.quote(boundary) + "$" に変更しようとすると、何も置き換えられません。2 つのループの代わりに matcher.replaceAll("$0--") を使用しようとすると、何も置き換えられません。私の目的を達成するためのエレガントな方法は何ですか?なぜそれが機能するのですか?

4

3 に答える 3

1

find();との一致を繰り返す必要はありません。それは何をするかの一部ですreplaceAll()

s = s.replaceAll("(?im)^--Boundary_\\([^\\)]*\\)$", "$0--");

置換文字列の$0inは、この反復で一致した正規表現に関係なくプレースホルダーです。

正規表現の(?im)先頭にあるで、CASE_INSENSITIVEモードとMULTILINEモードがオンになります。

于 2012-02-15T03:45:31.127 に答える
0

あなたはこのようなことを試すことができます:

String regex = "^--Boundary_\\([^\\)]*\\)(--)?$";

次に、文字列がで終わるかどうかを確認し、--そうでないものだけを置き換えます。

于 2012-02-15T01:41:15.110 に答える
0

すべての文字列が独自の行にあると仮定すると、これは機能します。 "(?im)^--Boundary_\\([^)]*\\)$"

スクリプト例:

String str = "--Boundary_([ArbitraryName])\n--Boundary_([ArbitraryName])--\n--Boundary_([ArbitraryName])\n--Boundary_([ArbitraryName])--\n";
System.out.println(str.replaceAll("(?im)^--Boundary_\\([^)]*\\)$", "$0--"));

編集: JavaScript から Java に変更されました。読み込みが速すぎたに違いありません (ご指摘ありがとうございます)。

于 2012-02-15T03:17:46.160 に答える