Java 在正则表达式中将单词与磅(#)符号匹配

Java 在正则表达式中将单词与磅(#)符号匹配,java,android,regex,text,Java,Android,Regex,Text,我用regexp检查一些文本是否包含单词(忽略边界) String regexp=“.\\b某些单词在这里\\b.*” 但是当“SOME_WORD”以#(hashtag)开头时,这个regexp返回false 这不完全是一个解决方案,因为它不再使用regexp,但您可以使用contains轻松实现: text = "some text and #test word"; matchingWord = "#test"; contains = text.contains(mat

我用regexp检查一些文本是否包含单词(忽略边界)
String regexp=“.\\b某些单词在这里\\b.*”
但是当“SOME_WORD”以#(hashtag)开头时,这个regexp返回
false


这不完全是一个解决方案,因为它不再使用regexp,但您可以使用contains轻松实现:

    text = "some text and #test word";
    matchingWord = "#test";
    contains = text.contains(matchingWord);
    // contains == true
\b#
模式匹配前面带有单词字符的
:字母、数字或下划线

如果您需要匹配前面没有单词字符的
#
,请使用负前视
(?。同样,要确保尾随
\b
匹配非单词字符,请使用
(?!\w)
负前视:

text.matches("(?s).*(?<!\\w)" + matchingWord + "(?!\\w).*");

还有一件事:
.matches
中的
*
并不是最好的正则表达式解决方案。类似于
“(?的正则表达式如果您要查找带前导“#”的单词,只需从搜索词中删除前导“#”,然后使用下面的正则表达式即可

text.matches("#\\b" + matchingWordWithoutLeadingHash + "\\b");

那么,您需要匹配什么作为单词边界?字符串的开头还是空白?通常,您可以使用
(?作为初始边界,
(?!\\S)
作为这种情况下的尾随边界(
text.matches(“)*(?确保搜索词不在单词字符内的另一个常用解决方案是使用明确的单词边界:
text.matches(“.*”(*您可以简单地使用
text.contains(#test))
结果将是
true
,如果您有一些特殊情况或多个场景,那么选择
regex
@pavenetsingh:如果文本中有
#testing
。@WiktorStribiżew是的,我在前面的评论中建议了一些建议它将返回假阳性如果字符串类似于
some#testing word(此处为测试单词)。
@WiktorStribiżew right.因此我需要使用regexp,因为我只需要匹配整个单词,但是
contains
在其他情况下将返回true(例如,“testing”中的“test”)这项工作,谢谢。但有一件事。如果在匹配文本中的单词后,我有了新行符号,那么matcher返回false。例如
“test#test\ntest”
。您可以改进这个regexp吗?添加
(?s)
。但是如果您使用
matcher#find()
,您甚至不需要它。
text.matches("(?s).*(?<!\\S)" + matchingWord + "(?!\\S).*");
text.matches("#\\b" + matchingWordWithoutLeadingHash + "\\b");