首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java正则表达式:将自定义的Hashtag模式与查找/隐藏条件匹配

Java正则表达式:将自定义的Hashtag模式与查找/隐藏条件匹配
EN

Stack Overflow用户
提问于 2015-10-04 04:02:46
回答 2查看 709关注 0票数 1

我目前正在学习如何通过匹配简单的Hashtag模式来用Java编写正则表达式。这些哈希标签符合以下条件:

  1. 它以一个主题标签开始:#
  2. 它必须包含至少一个字母:a。
  3. 它可以包含a-Za-Z0-9类中的任何字符。
  4. 不能在前面加上a-zA-Z0-9_类的字符。

基于此,我认为正确的正则表达式是:

代码语言:javascript
运行
复制
PATTERN = "(?<![a-zA-Z0-9_])#(?=.*[a-zA-Z])[a-zA-Z0-9_]+"

在这里,我使用了一个前瞻性(?=.*[a-zA-Z])来确保条件2保持,并使用一个查找后面的(?<![a-zA-Z0-9_])来确保条件4保持。我对以+结尾不太确定。

这在简单的测试用例上有效,但对于复杂的测试用例(如:

代码语言:javascript
运行
复制
String text = "####THIS_IS_A_HASHTAG; ;#This_1_2...#12_and_this but not #123  or #this# #or#that";

哪里不匹配#THIS_IS_A_HASHTAG#This_1_212_and_this

有人能解释我做错了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-04 08:07:40

这种展望:

代码语言:javascript
运行
复制
(?=.*[a-zA-Z])

在输入如下情况时,可能会产生错误的结果:

代码语言:javascript
运行
复制
####12345...#12_and_this

通过给你两个匹配的#12345#12_and_this。而根据你的规则,只有第二个应该是有效的匹配。

要解决这个问题,可以使用这个regex:

代码语言:javascript
运行
复制
(?<![a-zA-Z0-9_])#(?=[0-9_]*[a-zA-Z])[a-zA-Z0-9_]+

(?=[0-9_]*[a-zA-Z])的意思是在#后面断言一个字母,中间有一个数字或下划线。

这是一个regex演示

票数 2
EN

Stack Overflow用户

发布于 2015-10-04 04:15:37

这个怎么样?

(这里的例子)

代码语言:javascript
运行
复制
String text = "####THIS_IS_A_HASHTAG;;;#This_1_2...#12_and_this ";
String regex = "#[A-Za-z0-9_]+";

Matcher m = Pattern.compile(regex).matcher(text);

while (m.find()) {
  System.out.println(m.group());
}

看起来它符合你所说的标准:

代码语言:javascript
运行
复制
#THIS_IS_A_HASHTAG
#This_1_2
#12_and_this
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32929907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档