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