我找到标签的正则表达式是:
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
如何更改正则表达式?
答案 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())