上のいくつかの記事を確認してください、私はNNDDDDD
部分の後、最初A
が実際にN
いうよりA
になることを想定していますそうでなければ、DDDDD
とAAAA
部分の間には堅実な境界がないからです。
実際には文字列はNNDDDDDNAAA
のようになり、NAAA
部分をスペースで置き換えます。これを仮定すると、正規表現は次のように書き直すことができます。(\\D+\\d+)(\\D.+)
Javaの正のlookbehindには固定長のパターンが必要です。 +
または*
パターンは使用できません。代わりに、中括弧を使用して、最大長を指定することもできます。たとえば、あなたは、各+
の代わりに{1,9}
を使用することができ、それは1〜9の文字にマッチします:(?<=\\D{1,9}\\d{1,9})(\\D.+)
ここでの唯一の問題はあなたがそうなりますを使用して、単一のマッチとしてNAAAシーケンスにマッチしていていますNAAA
シーケンス全体を複数のスペースではなく単一のスペースで置き換えることができます。
マッチの開始区切り文字と文字列の長さを使用して、それを使って正しいスペース数を追加できますが、その点は表示されません。私はあなたが元のソリューションで一層良いと思う。そのシンプルで簡単に従うこと。
速度を少し上げたい場合は、関数の外でパターンをコンパイルし、StringBuilderまたはStringBufferを使用して出力を作成できます。これらのすべてのNNDDDDDAAAAA要素から大きなStringを構築する場合は、追加が完了するまでStringBuilderで完全に作業します。
class Test {
public static Pattern p = Pattern.compile("(\\D+\\d+)(\\D.+)");
public static StringBuffer replace(String input) {
StringBuffer output = new StringBuffer();
Matcher m = Test.p.matcher(input);
if(m.matches())
output.append(m.group(1)).append(m.group(2).replaceAll("."," "));
return output;
}
public static void main(String[] args) {
String input = args[0];
long startTime;
StringBuffer tests = new StringBuffer();
startTime = System.currentTimeMillis();
for(int i = 0; i < 50; i++)
{
tests.append("Input -> Output: '");
tests.append(input);
tests.append("' -> '");
tests.append(Test.replace(input));
tests.append("'\n");
}
System.out.println(tests.toString());
System.out.println("\n" + (System.currentTimeMillis()-startTime));
}
}
更新: 私は、迅速な反復解法を書いた、との両方を通じて、いくつかのランダムなデータを走りました。反復解は約4〜5倍高速です。
public static StringBuffer replace(String input)
{
StringBuffer output = new StringBuffer();
boolean second = false, third = false;
for(int i = 0; i < input.length(); i++)
{
if(!second && Character.isDigit(input.charAt(i)))
second = true;
if(second && !third && Character.isLetter(input.charAt(i)))
third = true;
if(second && third)
output.append(' ');
else
output.append(input.charAt(i));
}
return output;
}
「A」と「A」の違いを教えてください。 Do 'Aはいつも' D 'の後に来ますか? – BryanH
最後の "D"と最初の "A"の違いはどうやって分かりますか? "A"のグループは "D"タイプの文字ではないことが保証されていますか? –
Curtis Taskerは正しいです、NNDDDDの後の最初のAは常にNです。残りは何でもあります。 –