2

1 つ以上の sequence で始まる文字列があります"Re:"。これ"Re:"は、たとえば、任意の組み合わせにすることができます。Re<any number of spaces>:re:re<any number of spaces>:RE:RE<any number of spaces>:など

文字列 のサンプル シーケンス : のRe: Re : Re : re : RE: This is a Re: sample string.
すべての出現箇所を識別して削除する Java 正規表現を定義したいと考えていますがRe:、文字列内に出現するものではなく、文字列の先頭にあるもののみを削除します。
したがって、出力は次のようThis is a Re: sample string.
になります。

String REGEX = "^(Re*\\p{Z}*:?|re*\\p{Z}*:?|\\p{Z}Re*\\p{Z}*:?)";
String INPUT = title;
String REPLACE = "";
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT);
while(m.find()){
  m.appendReplacement(sb,REPLACE);
}
m.appendTail(sb);

私はp{Z}空白を一致させるために使用しています(Java正規表現では識別されないため、このフォーラムのどこかでこれを見つけました\s)。

このコードで私が直面している問題は、検索が最初の一致で停止し、while ループをエスケープすることです。

4

2 に答える 2

6

次のような置換ステートメントを試してください。

yourString = yourString.replaceAll("(?i)^(\\s*re\\s*:\\s*)+", "");

正規表現の説明:

(?i)  make it case insensitive
^     anchor to start of string
(     start a group (this is the "re:")
\\s*  any amount of optional whitespace
re    "re"
\\s*  optional whitespace
:     ":"
\\s*  optional whitespace
)     end the group (the "re:" string)
+     one or more times
于 2013-06-25T19:08:15.120 に答える
2

あなたの正規表現で:

String regex = "^(Re*\\p{Z}*:?|re*\\p{Z}*:?|\\p{Z}Re*\\p{Z}*:?)"

これが何をするかです:

正規表現イメージ

ここでライブを見る

次のような文字列に一致します。

  • \p{Z}Reee\p{Z:また
  • R\p{Z}}}

あなたがやろうとしていることには意味がありません:

次のような正規表現を使用することをお勧めします。

yourString.replaceAll("(?i)^(\\s*re\\s*:\\s*)+", "");

または@Doorknobを幸せにするために、これを達成する別の方法がありMatcherます。

Pattern p = Pattern.compile("(?i)^(\\s*re\\s*:\\s*)+");
Matcher m = p.matcher(yourString);
if (m.find())
    yourString = m.replaceAll("");

(これは、ドキュメントが とまったく同じことを言っているためですyourString.replaceAll()

正規表現イメージ

ここを見て

(私は @Doorknob と同じ正規表現を持っていましたが、大文字と小文字を区別しない部分replaceAllについて考えてくれた @jlordo と@Doorknob に感謝します;-))(?i)

于 2013-06-25T19:11:56.263 に答える