在Java中匹配字符串中的单词

我试图在Java中匹配包含单词"#SP" (没有引号,不区分大小写)的字符串。 但是,我发现使用Regexes非常困难!

我需要匹配的字符串: "This is a sample #sp string""#SP string text...""String text #Sp"

字符串我不想匹配: "Anything with #Spider""#Spin #Spoon #SPORK"

以下是我到目前为止的内容: http ://ideone.com/B7hHkR。有人可以指导我构建我的正则表达式吗?

我也尝试过: "\\w*\\s*#sp\\w*\\s*"无济于事。

编辑:这是IDEone的代码:

 java.util.regex.Pattern p = java.util.regex.Pattern.compile("\\b#SP\\b", java.util.regex.Pattern.CASE_INSENSITIVE); java.util.regex.Matcher m = p.matcher("s #SP s"); if (m.find()) { System.out.println("Match!"); } 

你做得很好,但#前面的\ b是误导性的。 \ b是单词边界,但#已经不是单词字符(即它不在集合[0-9A-Za-z_]中)。 因此,#之前的空格不被视为单词边界。 改成:

 java.util.regex.Pattern p = java.util.regex.Pattern.compile("(^|\\s)#SP\\b", java.util.regex.Pattern.CASE_INSENSITIVE); 

(^ | \ s)表示:匹配^ OR \ s,其中^表示字符串的开头(例如“#SP String”),\ s表示空白字符。

(编辑:不需要正面看后,只匹配完成,不替换)

您是Java错误的正则表达式匹配方法的另一个受害者。

.matches()非常不幸地试图匹配整个输入 ,这明显违反了“正则表达式匹配”的定义(正则表达式可以匹配输入中的任何位置)。 您需要使用的方法是.find()

这是一个脑死亡API,遗憾的是Java并不是唯一具有此类错误方法名称的语言。 Python也认罪。

此外,您还有一个问题,即\\b将检测字边界,而#不是单词的一部分。 您需要使用交替检测输入的开头或空格。

您的代码需要看起来像这样(非完全限定类):

 Pattern p = Pattern.compile("(^|\\s)#SP\\b", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher("s #SP s"); if (m.find()) { System.out.println("Match!"); } 

正则表达式"\\w*\\s*#sp\\w*\s*"将匹配0或更多单词,后跟0或更多空格,后跟#sp,后跟0或更多单词,后跟0个或更多空格。 我的建议是不要使用\ s *在你的表达中打破单词,而是使用\ b。

 "(^|\b)#sp(\b|$)"