使用自定义正则表达式替换Java字符串

时间:2017-12-01 16:18:55

标签: java regex string replace

我有一个Java应用程序可以传输Twitter数据。

假设我有一个String text = tweet.getText()变量。

在文字中,我们可以有一个或多个@MentionedUser。我不仅要删除@,还要删除用户名。 如何使用replaceAll并且不触及字符串的其余部分来执行此操作?

谢谢。

2 个答案:

答案 0 :(得分:2)

我想使用(^|\s)@\w+($|\s),因为您可以在输入中收到电子邮件,例如:

a @twitter username and a simple@email.com another @twitterUserName

所以你可以使用:

String text = "a @twitter username and a simple@email.com another @twitterUserName";
text = text.replaceAll("(^|\\s)@\\w+($|\\s)", "$1$2");
// Output : a  username and a simple@email.com another 

详细信息:

  1. (^|\s)匹配^字符串的开头或|空格\s
  2. @\w+匹配@后跟一个或多个单词字符,相当于[A-Za-z0-9_]
  3. ($|\s)匹配$字符串结尾或|空格\s
  4. 如果你想更深入地指定twitter用户名的正确语法我读了这个article here,他们提到了一些有用的信息:

      
        
    • 您的用户名不能超过15 characters。您的姓名可以更长(50个字符),但用户名可以缩短   为了方便起见。

    •   
    • 用户名只能包含字母数字字符(字母A-Z,数字0-9),但下划线除外,如上所述。 ...

    •   

    根据这条规则,您也可以使用此正则表达式:

    (?i)(^|\s)@[a-z0-9_]{1,15}($|\s)
    

答案 1 :(得分:1)

这是一种替代方案,它不会产生双倍的空格,也不会捕获电子邮件:

String str = "a @twitter    @user     username and a john.doe@gmail.com another @twitterUserName @test jane@doe.com";
System.out.println(str.replaceAll("(?<=[^\\w])@[^@\\s]+(\\s+|$)", ""));

输出:

a username and a john.doe@gmail.com another jane@doe.com

实际正则表达式(?<=[^\w])@[^@\s]+(\s+|$)的部分说明:

  1. (?&lt; = [^ \ w])@ - 尝试找到'@'字符然后回头检查后面是否有常规字符(使用零宽度)积极的背后)。
  2. [^ @ \ s] + - 查找不是'@'或空格字符的内容
  3. (\ s + | $) - 查找多个空格或行尾