用于在Tweeter消息中提取提到的名称的Java Regular Expression

时间:2017-06-13 10:35:38

标签: java regex

我正在编写一个小程序,使用正则表达式提取Tweeter消息中提到的用户名。但是,在某些测试用例中,部分程序失败了。基本上,下面指定的正则表达式模式能够匹配text1但不匹配text2。现在,下面的正则表达式模式只是为了匹配特定的测试用例,当字符串中的第一个字符是“@”后跟一个有效的用户名在tweeter中。我想我一定误解了这个正则表达式并错误地使用了它。有人能够对此有所了解吗?

String validTweetPattern1 = "^[@]((?=.*[A-Za-z0-9])[\\w-_]+)";
String text1 = "@mention";
String text2 = "@mention @hello";

System.out.println(Pattern.matches(validTweetPattern1, text1));  
System.out.println(Pattern.matches(validTweetPattern1, text2));  

Console Output:
True
False

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果不确切地知道你打算用正则表达式做什么,我可以建议您更改以下模式:

String validTweetPattern1 = "(?:^|.*\\s+)[@]((?=.*[A-Za-z0-9])[\\w-_]+).*";

这将Twitter标签标识为以字符串开头的@符号开头的字符串,如果前面有空格,则在字符串的中间。您可以在下面的演示中查看此正则表达式未捕获的电子邮件地址。您当前的模式是在字符串的最开头搜索主题标签,并且不允许在第一个标记之后显示空格,后跟另一个标记。

Demo

答案 1 :(得分:0)

Pattern.matches()仅在完全匹配时返回true。如果您想继续使用它,则必须将模式更改为"^[@]((?=.*[A-Za-z0-9])[\\w-_]+)\\s*.*"这将添加可能的空格,后跟可能更多的字符。

您的另一个选择是使用当前模式的匹配器类。

    System.out.println(Pattern.compile(validTweetPattern1).matcher(text1).find());  
    System.out.println(Pattern.compile(validTweetPattern1).matcher(text2).find());  

这将在文本中找到模式的出现。