我目前正在学习如何通过匹配简单的Hashtag模式来用Java编写正则表达式。这些哈希标签符合以下条件:
基于此,我认为正确的正则表达式是:
PATTERN = "(?<![a-zA-Z0-9_])#(?=.*[a-zA-Z])[a-zA-Z0-9_]+"
在这里,我使用了一个前瞻性(?=.*[a-zA-Z])
来确保条件2保持,并使用一个查找后面的(?<![a-zA-Z0-9_])
来确保条件4保持。我对以+
结尾不太确定。
这在简单的测试用例上有效,但对于复杂的测试用例(如:
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_2
和12_and_this
有人能解释我做错了什么吗?
发布于 2015-10-04 08:07:40
这种展望:
(?=.*[a-zA-Z])
在输入如下情况时,可能会产生错误的结果:
####12345...#12_and_this
通过给你两个匹配的#12345
和#12_and_this
。而根据你的规则,只有第二个应该是有效的匹配。
要解决这个问题,可以使用这个regex:
(?<![a-zA-Z0-9_])#(?=[0-9_]*[a-zA-Z])[a-zA-Z0-9_]+
(?=[0-9_]*[a-zA-Z])
的意思是在#
后面断言一个字母,中间有一个数字或下划线。
发布于 2015-10-04 04:15:37
这个怎么样?
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());
}
看起来它符合你所说的标准:
#THIS_IS_A_HASHTAG
#This_1_2
#12_and_this
https://stackoverflow.com/questions/32929907
复制相似问题