0

ループ中に「at」という単語のすべてのインスタンスを(無駄に)削除しようとしています。

Pattern atPattern = Pattern.compile(".*\\bat\\b.*");
String input = "at Pat's attic a fat cat catcher at patted at"

// required output "Pat's attic a fat cat catcher patted"

output = input.replace(atPattern.pattern(), " ");

output= input.replaceAll(".*\\bat\\b.*", " ");

Matcher atMatcher = atPattern.matcher(input);

output = atMatcher.replaceAll(" ");

// Starting to clutch at straws now...

Matcher atMatcher = Pattern.compile(".*\\bat\\b.*").matcher(input);

output = atMatcher.matcher(input).replaceAll(" ");

output = atPattern.matcher(input).replaceAll(" "); 

上記の他の多くの組み合わせも試しましたが、希望する出力が得られません...

私の惨めさから私を出してくれませんか。

4

3 に答える 3

2

シングルで十分であり、そのような'sのreplaceAll(...)後にいくつかのオプションのスペースを削除する必要があります。at

String input = "at Pat's attic a fat cat catcher at patted at";
String expected = "Pat's attic a fat cat catcher patted";

System.out.println(input.replaceAll("\\bat\\b\\s*", "").trim());
System.out.println(expected.trim());

上記は印刷されます:

Pat's attic a fat cat catcher patted
Pat's attic a fat cat catcher patted
于 2012-06-17T14:19:03.967 に答える
1

それは簡単に行うことができます:

"at Pat's attic a fat cat catcher at patted at"
    .replaceAll("\\bat\\b","").trim().replaceAll(" +", " ")

trim()と2つ目replaceAll()は、スペースを削除するためのものです。

これらすべてを1つのステップで実行する方法はおそらく他にもありますが(おそらくより高速ですか?)、それらを分離する方がロジックについて考える方が簡単です。

編集

念のため、これは1つのワンステップソリューションです。

.replaceAll("(?i)(\\bat\\b | ?\\bat\\b)","")

(?i)大文字と小文字を区別しないためにが追加されています。不要な場合は削除できます。

于 2012-06-17T14:17:12.113 に答える
1

あなたはこれを行うことができます

.replaceAll("(\\s|^)(at)(\\s|$)", " ").trim()
于 2012-06-17T14:24:49.147 に答える