[android]匹配一个字用井号 (#) 符号在正则表达式

发布时间: 2017/3/19 17:07:37
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有正则表达式检查,如果一些文本包含词 (与忽略边界)
String regexp = ".*\\bSOME_WORD_HERE\\b.*";但这个正则表达式返回 false 当"SOME_WORD"开始以 # (标签)。

Example, without #   
String text = "some text and test word";
String matchingWord = "test";
boolean contains = text.matches(".*\\b" + matchingWord + "\\b.*");
// now contains == true; 

But with hashtag `contains` was false. Example:
text = "some text and #test word";
matchingWord = "#test"; 
contains = text.matches(".*\\b" + matchingWord + "\\b.*");
//contains == fasle; but I expect true    

解决方法 1:

\b#模式匹配 # ,前面带一个单词字符︰ 字母、 数字或下划线。

如果你需要匹配 # ,不前面带有一个单词字符,使用负预测先行 (?<!\w) 。同样,以确保尾随 \b 匹配一个非单词字符是存在的如果使用 (?!\w) 负预测先行︰

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

使用 Pattern.quote(matchingWord) 是一个好主意,如果你 matchingWord 可以包含特殊正则表达式元字符。

或者,如果您计划以匹配您的搜索词之间的空格或开始/结束的字符串,则可以使用 (?<!\S) 作为初始边界和 (?!\S) 作为尾随一

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

还有一件事︰ .*.matches 不是最好的正则表达式解决方案。一个正则表达式喜欢 "(?<!\\S)" + matchingWord + "(?!\\S)"Matcher#find() 将处理更为优化的方式,但您将需要初始化 Matcher 为此对象。

赞助商