Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中匹配字符串中的单词_Java_Regex - Fatal编程技术网

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

在Java中匹配字符串中的单词,java,regex,Java,Regex,我试图匹配Java中包含单词“#SP”(无引号,不区分大小写)的字符串。然而,我发现使用正则表达式非常困难 我需要匹配的字符串: “这是一个样本#sp字符串”, “#SP字符串文本…”, “字符串文本#Sp” 我不想匹配的字符串: “任何带有蜘蛛的东西”, “#旋转#勺子#SPORK” 以下是我到目前为止所做的:。有人能指导我如何构建我的regexp吗 我也尝试过:“\\w*\\s*#sp\\w*\\s*”,但没有效果 编辑:以下是来自IDEone的代码: java.util.regex.Pat

我试图匹配Java中包含单词
“#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);