2

我有一个以出现一次或多次的序列开头的字符串"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 相同的正则表达式,但感谢@jlordoreplaceAll和@Doorknob 考虑(?i)不区分大小写的部分;-))

于 2013-06-25T19:11:56.263 回答