java - 在正则表达式中匹配带有井号 (#) 的单词

标签 java android regex text

我有正则表达式来检查某些文本是否包含单词(忽略边界)
String regexp = ".*\\bSOME_WORD_HERE\\b.*"; 但当“SOME_WORD”以#(井号标签)开头时,此正则表达式返回 false

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    

最佳答案

\b#模式匹配 #前面有单词字符:字母、数字或下划线。

如果需要匹配#如果前面没有单词 char,请使用负向后视 (?<!\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对象。

关于java - 在正则表达式中匹配带有井号 (#) 的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41396917/

相关文章:

android - android中的java.lang.NoSuchMethodError : no static method "Lorg/pjsip/pjsua2/pjsua2JNI;. SwigDirector_AudioMediaPlayer

jQuery 检查第一个哈希值的 url 字符串,然后删除它之前的所有内容

java - 如何从 Java 中的字符串中删除所有非字母字符?

java.lang.UnsatisfiedLinkError : no rxtxSerial in java. 库路径

java - "if"语句对时间复杂度分析有影响吗?

android - 使用 Android Studio 0.4.0 和 Gradle 1.9 刷新 Gradle 项目失败

java - Java 中的正则表达式(Spring 配置)开头有 2 个特定字符

java - 如何在 Java 中实现 addFields mongoDB 查询

java - httpclient返回登录页面的响应,而不是请求的页面,但返回200 ok作为状态码

android - 当我设置 minDate 和 maxDate 时 DatePickerDialog 出错