在Java中匹配字符串中的单词
我试图匹配Java中包含单词在Java中匹配字符串中的单词,java,regex,Java,Regex,我试图匹配Java中包含单词“#SP”(无引号,不区分大小写)的字符串。然而,我发现使用正则表达式非常困难 我需要匹配的字符串: “这是一个样本#sp字符串”, “#SP字符串文本…”, “字符串文本#Sp” 我不想匹配的字符串: “任何带有蜘蛛的东西”, “#旋转#勺子#SPORK” 以下是我到目前为止所做的:。有人能指导我如何构建我的regexp吗 我也尝试过:“\\w*\\s*#sp\\w*\\s*”,但没有效果 编辑:以下是来自IDEone的代码: java.util.regex.Pat
“#SP”
(无引号,不区分大小写)的字符串。然而,我发现使用正则表达式非常困难
我需要匹配的字符串:
“这是一个样本#sp字符串”
,
“#SP字符串文本…”
,
“字符串文本#Sp”
我不想匹配的字符串:
“任何带有蜘蛛的东西”
,
“#旋转#勺子#SPORK”
以下是我到目前为止所做的:。有人能指导我如何构建我的regexp吗
我也尝试过:“\\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!");
}
正则表达式
“\\w*\\s*#sp\\w*\s*”
将匹配0个或多个单词,后跟0个或多个空格,后跟#sp,后跟0个或多个单词,后跟0个或多个空格。我的建议是不要使用\s*来分解表达式中的单词,而是使用\b
"(^|\b)#sp(\b|$)"
(编辑:不需要正向查找,只进行匹配,不进行替换)
您是Java错误命名的正则表达式匹配方法的另一个受害者
.matches()
非常不幸,因此尝试匹配整个输入,这显然违反了“正则表达式匹配”(正则表达式可以匹配输入中的任何位置)的定义。您需要使用的方法是.find()
这是一个死气沉沉的API,不幸的是,Java并不是唯一一种有这种错误方法名称的语言。Python也认罪
还有一个问题是,\\b
将检测单词边界,并且#
不是单词的一部分。您需要使用交替检测输入或空格的开头
您的代码需要如下所示(非完全限定类):
你做得很好,但是#前面的\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表示空白字符。
*
在正则表达式中表示“零次或多次”。@BrianRoach我认为我使用它是正确的。例如:“这是一个#sp”
(在#sp之前超过0次,在#sp之后超过0次),“#sp text”
(在#sp之前超过0次,在#sp之后超过0次),“#sp”
(在#sp之前和之后超过0次)使用正则表达式时,您只需要匹配想要匹配的文本。除非您明确需要,否则不要担心要匹配的内容之前或之后的内容。这也是锚点发挥作用的地方,因为它们不使用文本:\\b
将检测“单词边界”,但不会使用单词前后的字符。下面是使用“\b\SP\b”
的结果:它仍然与字符串不匹配。出于某种原因,Java中的\b单词边界与字符串的开头或结尾不匹配。我已经编辑了我的答案来适应这个。什么是“?非常感谢。但请允许我理解您的regexp:?(?不客气。显然,您确实需要更改以查找(),而不是匹配(),正如fge所说。他今天教了我们两个东西。
java.util.regex.Pattern p =
java.util.regex.Pattern.compile("(^|\\s)#SP\\b",
java.util.regex.Pattern.CASE_INSENSITIVE);