在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|$)"