如何使用java中的Pattern删除字符串中的@

时间:2014-08-13 17:14:03

标签: java regex

我需要删除以@。

开头的字符串部分

我的示例代码适用于一个字符串,而另一个字符串则失败。

失败之一:无法删除@ news4buffalo:

String regex = "\\@\\w+ || @\\w*";
String rawContent =  "RT @news4buffalo: Police say a shooter fired into a crowd    yesterday on the Oakmont overpass, striking and killing a 14-year-old. More: http…";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(rawContent);
if (matcher.find()) {
    rawContent = rawContent.replaceAll(regex, "");
} 

成功一:

String regex = "\\@\\w+ || @\\w*";
String rawContent =  "@ZaslowShow couldn't agree more. Good crowd last night. #LetsGoFish";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(rawContent);
if (matcher.find()) {
    rawContent = rawContent.replaceAll(regex, "");
} 

输出:

couldn't agree more. Good crowd last night. #LetsGoFish

4 个答案:

答案 0 :(得分:1)

从你的问题来看,这个正则表达式可以为你效用:

rawContent = rawContent.replaceAll("@\\S*", "");

答案 1 :(得分:1)

您也可以尝试这种方式。

String s = "@ZaslowShow couldn't agree more. Good crowd last night. #LetsGoFish";
System.out.println(s.replaceAll("@[^\\s]*\\s+", ""));
// Look till space is not found----^^^^  ^^^^---------remove extra spaces as well

答案 2 :(得分:0)

正则表达式只考虑单词字符,而输入String包含冒号:。您可以通过在正则表达式中将\\w替换为\\S(任何非空格字符)来解决此问题。此外,不需要两种模式。

String regex = "@\\S*";

答案 3 :(得分:0)

  1. 您不需要逃离@,因此请不要在\之前添加"\\@"(它会让人感到困惑)。

  2. 不要使用匹配器来检查字符串是否包含应该替换的部分,而不是使用replaceAll,因为您必须第二次迭代。只需在开始时使用replaceAll,如果它没有任何要替换的内容,它将保持字符串不变。 BTW。使用Matcher实例中的replaceAll来避免重新编译Pattern。

  3. 表单foo||bar中的正则表达式似乎不对。正则表达式只使用一个管道|来表示OR,因此这样的正则表达式代表foo OR emptyStringbar。由于空String是一种特殊的(每个字符串在开始,结尾,甚至在字符之间包含空字符串),它可能会导致一些问题,如"foo".replaceAll("|foo", "x")返回xfxoxox,而不是例如{{ 1}}因为在"xxx"之前消耗空字符串会阻止它被用作f的潜在第一个字符:/

  4. 无论如何,您似乎想接受任何foo字词,因此如果您想确保在@xxxx之后至少有一个字符,请考虑"@\\w+"

    您还可以添加@必须是单词的第一个字符的条件(如果您不想从电子邮件地址中删除@之后的部分)。要做到这一点,只需使用像@这样的后视,它会在(?<=\\s|^)@存在一些空格之前检查它,或者它放在字符串的开头。

    您还可以删除要删除的单词之后的空格(有任何内容)。

    所以你可以试试

    @

    用于

    等数据
    String regex = "(?<=\\s|^)@\\w*\\s?";
    

    将返回

    RT @news4buffalo: Police say a shooter fired into a crowd    yesterday on the Oakmont overpass, striking and killing a 14-year-old. More: http…
    

    但是,如果您还希望删除RT : Police say a shooter fired into a crowd yesterday on the Oakmont overpass, striking and killing a 14-year-old. More: http… \\w之类的字母或数字字符旁边的其他字符,则只需使用代表非空白字符的:,那么您的正则表达式可以看起来像

    \\S