正则表达式Hashtag

时间:2018-03-23 12:48:39

标签: java regex

我找到标签的正则表达式是:

String REG_EX_TAG = "[#]{1}+[A-Za-z0-9-_]+\b";
Pattern tagMatcher = Pattern.compile(REG_EX_TAG);

但是如果我插入字符串today it's a beautiful sunny day #sun. Hello my name is Mat #Sweet#Home,结果是: 标签#Sweet,#Home,#sun

我希望结果只是标签#Sweet和#sun

如何更改正则表达式?

2 个答案:

答案 0 :(得分:2)

"\b"匹配退格字符,而不是字边界。你需要双倍逃脱它。

此外,该模式似乎只匹配字符串中任何位置的任何#标签。如果有一串主题标签,你需要获得第一个。

您可以使用

(#[A-Za-z0-9-_]+)(?:#[A-Za-z0-9-_]+)*

请参阅regex demo

<强>详情

  • (#[A-Za-z0-9-_]+) - 第1组捕获第一次出现#后跟1+个字母,数字,-_
  • (?:#[A-Za-z0-9-_]+)* - 匹配标签模式的0+重复。

仅抓取第1组值。

请参阅Java demo

String s = "today it's a beautiful sunny day #sun. Hello my name is Mat #Sweet#Home";
Pattern pattern = Pattern.compile("(#[A-Za-z0-9-_]+)(?:#[A-Za-z0-9-_]+)*\\b");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group(1)); 
} 
// => [#sun, #Sweet]

请注意{1}+是多余的,它匹配1次出现的量化子模式(这是默认操作)。

答案 1 :(得分:1)

也许这可能会有所帮助:

".*?\\s(#\\w+).*?"

在您的程序中实现如下:

String YourString = "Today is a beautiful sunny day #sun. Hello my name is Mat #Sweet#Home";

String REG_EX_TAG = ".*?\\s(#\\w+).*?";

Pattern tagMatcher = Pattern.compile(REG_EX_TAG);
Matcher m = tagMatcher.matcher(YourString);
if(m.find())
{
    String tag = m.group(1);
    // Whatever you want to do with the tag - store it, print it, etc.
}

m.group(1)包含标记(因为在正则表达式中,它括在括号内)

正则表达式 -

^表示String的开头,因此匹配的标签是第一个。

.*?是任何字符序列(非主题标签部分)的懒惰匹配,即单词,数字,空格等。

\\s告诉正则表达式将标记与之前的空格匹配(据我所见,这是OP设置的条件)

(#\\w+)是实际标记,由#和一个或多个单词字符表示,即字母,数字,下划线或它们的组合。

最后,.*?表示主题标签后面可能还有更多文字。

注意 - 此正则表达式将匹配主题标签的典型约定,即#Blessed#9_11#I_Need_MoreUpvotes,不带任何特殊字符,并且前面带有空间。

编辑 - 要匹配所有代码,只需将if(m.find())替换为while(m.find())