正则表达式在字符串中查找单词

时间:2015-08-02 01:54:10

标签: java regex linkify

请在 Linkify 中使用正则表达式作为Pattern使用。

我试图在字符串中提取 #hashtags @mentions ,所以我需要找到以{{1}开头的字符串中的单词和#(当然以空白结束),只是在一个正则表达式中。

在这个词中,我需要承认任何语言中的每个可能的字符(某处:) :)。

谢谢。

修改

当我说每个可能的字符时,我错了:我无论如何都要遵循相同的推特规则,所以例如@之类的字符不被允许。

3 个答案:

答案 0 :(得分:2)

如果您想要Twitter规则,为什么不使用比其他任何人更了解规则的图书馆:the Twitter themselves? : - )

如果您使用Gradle,只需将compile 'com.twitter:twitter-text:1.12.1'添加到Gradle文件中的依赖项即可。

或者对于Maven,添加到pom.xml:

<dependencies>
  <dependency>
    <groupId>com.twitter</groupId>
    <artifactId>twitter-text</artifactId>
    <version>1.12.1</version>
  </dependency>
</dependencies>

然后在您的代码中,您可以像这样调用Twitter库:

import com.twitter.Extractor;

public class Main {
    public static void main(String[] args) {
        Extractor extractor = new Extractor();
        String text = "extracting hashtags and mentions in #java using @twitter library from @github";

        System.out.println("#hashtags:");
        for (String hashtag : extractor.extractHashtags(text)) {
            System.out.println(hashtag);
        }

        System.out.println();
        System.out.println("@mentions:");
        for (String mention : extractor.extractMentionedScreennames(text)) {
            System.out.println(mention);
        }
    }
}

答案 1 :(得分:1)

更新

在看到您想根据Twitter识别哈希标签并阅读_Actual_ Twitter format for hashtags? Not your regex, not his code-- the actual one?

之后

尝试这种模式:

"^[@#]\\w+|(?<=\\s)[@#]\\w+"

它匹配以"@""#"开头的字词,这些字词位于行的开头或前面有空格

代码示例:

public static void main(String[] args) throws Exception {
    String string = "#hashtags and @mentions";
    Matcher matcher = Pattern.compile("^[@#]\\w+|(?<=\\s)[@#]\\w+").matcher(string);
    while (matcher.find()) {
        System.out.println(matcher.group());
    }
}

结果:

#hashtags
@mentions

答案 2 :(得分:0)

尝试使用此正则表达式(在Java中使用\\而不是\

/(#\S+)|(@\S+)/g

/([#@]\S+)/g

你也可以使用它来使用\1替换:

/.*?([#@]\S+)[^#@]*/g

[Regex Demo]

如果您要删除#@,请使用此选项:

/.*?[#@](\S+)[^#@]*/g

/.*?[#@](\S+)[^#@\-]*/g
String rgx = ".*?[#@](\S+)[^#@\-]*";
Pattern pattern = Pattern.compile(rgx, Pattern.DOTALL);