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

时间:2012-12-20 22:54:37

标签: java regex

我正在尝试在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!");
}

3 个答案:

答案 0 :(得分:5)

(编辑:不需要正面观察,仅匹配,不替换)

你是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!");
}

答案 1 :(得分:4)

你做得很好,但是#前面的\ 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表示空格字符。

答案 2 :(得分:1)

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

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