我正在编写一个小程序,使用正则表达式提取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
提前致谢。
答案 0 :(得分:1)
如果不确切地知道你打算用正则表达式做什么,我可以建议您更改以下模式:
String validTweetPattern1 = "(?:^|.*\\s+)[@]((?=.*[A-Za-z0-9])[\\w-_]+).*";
这将Twitter标签标识为以字符串开头的@
符号开头的字符串,如果前面有空格,则在字符串的中间。您可以在下面的演示中查看此正则表达式未捕获的电子邮件地址。您当前的模式是在字符串的最开头搜索主题标签,并且不允许在第一个标记之后显示空格,后跟另一个标记。
答案 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());
这将在文本中找到模式的出现。