Java 尝试执行正则表达式时可能出现反斜杠转义问题

Java 尝试执行正则表达式时可能出现反斜杠转义问题,java,regex,Java,Regex,您好,我有以下句子,它位于一个更大的字符串变量中: New Component <b>TEST</b> is successfully registered. 新组件测试已成功注册。 我正在尝试执行正则表达式匹配,以在字符串中找到这个句子。单词测试是可变的,可以是任何单词 我在regexr中使用了以下运行良好的模式: New Component <b>\w*<\/b> is successfully registered. 新组件\w*已成功

您好,我有以下句子,它位于一个更大的字符串变量中:

New Component <b>TEST</b> is successfully registered.
新组件测试已成功注册。
我正在尝试执行正则表达式匹配,以在字符串中找到这个句子。单词测试是可变的,可以是任何单词

我在regexr中使用了以下运行良好的模式:

New Component <b>\w*<\/b> is successfully registered.
新组件\w*已成功注册。
在我的java代码中,我必须按照

Pattern p = Pattern.compile("New Component <b>\\w*<\\/b> is successfully registered.");
Matcher m = p.matcher(result.toString()); 
if (m.matches()) {
  System.out.println("hurray!");
}
Pattern p=Pattern.compile(“新组件\\w*已成功注册”);
Matcher m=p.Matcher(result.toString());
如果(m.matches()){
System.out.println(“万岁!”);
}

这是因为我需要避开反斜杠。但是,该模式在php代码中没有接收到匹配项,并且没有打印hurray。反斜杠或我在这里使用反斜杠的方式是否存在导致匹配器失败的问题?

尝试将
*
添加到模式的开头和结尾:

Pattern p = Pattern.compile(".*New Component <b>\\w*<\\/b> is successfully registered\..*");
Pattern p=Pattern.compile(“.*New Component\\w*已成功注册\..*”;
您的模式正在尝试匹配字符串,但是它不会匹配,因为它是较大字符串的一部分,因此目标字符串之前或之后的任何字符都不会被正则表达式接受并导致其失败

*
告诉匹配器在目标字符串前后接受0个或更多字符


编辑:另外,如果要匹配行尾的句号,应使用
\.
转义句号。这是因为点在正则表达式中有特殊含义,它表示任何字符。

尝试将
*
添加到模式的开头和结尾:

Pattern p = Pattern.compile(".*New Component <b>\\w*<\\/b> is successfully registered\..*");
Pattern p=Pattern.compile(“.*New Component\\w*已成功注册\..*”;
您的模式正在尝试匹配字符串,但是它不会匹配,因为它是较大字符串的一部分,因此目标字符串之前或之后的任何字符都不会被正则表达式接受并导致其失败

*
告诉匹配器在目标字符串前后接受0个或更多字符


编辑:如果你想匹配行尾的句号,你应该用
\.
来转义句号。这是因为点在正则表达式中有特殊的含义,它意味着任何字符。

在@dahui的答案后面,另一个选项是切换
m.matches()

.matches()
要求正则表达式匹配整个字符串。
.find()
要求正则表达式匹配字符串的任何子字符串

编辑: 运行以下命令时会打印“万岁!”:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SO {

    public static void main(String[] args) {

        Pattern p = Pattern.compile("New Component <b>\\w*<\\/b> is successfully registered.");
        Matcher m = p.matcher("New Component <b>TEST</b> is successfully registered."); 
        if (m.matches()) {
          System.out.println("hurray!");
        }

    }

}
import java.util.regex.Matcher;
导入java.util.regex.Pattern;
公开课{
公共静态void main(字符串[]args){
Pattern p=Pattern.compile(“新组件\\w*已成功注册”);
Matcher m=p.Matcher(“新组件测试已成功注册”);
如果(m.matches()){
System.out.println(“万岁!”);
}
}
}

有没有可能
result.toString()
不是你想象的那样?

关于@dahui的答案,另一个选项是切换
m.matches()

.matches()
要求正则表达式匹配整个字符串。
.find()
要求正则表达式匹配字符串的任何子字符串

编辑: 运行以下命令时会打印“万岁!”:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SO {

    public static void main(String[] args) {

        Pattern p = Pattern.compile("New Component <b>\\w*<\\/b> is successfully registered.");
        Matcher m = p.matcher("New Component <b>TEST</b> is successfully registered."); 
        if (m.matches()) {
          System.out.println("hurray!");
        }

    }

}
import java.util.regex.Matcher;
导入java.util.regex.Pattern;
公开课{
公共静态void main(字符串[]args){
Pattern p=Pattern.compile(“新组件\\w*已成功注册”);
Matcher m=p.Matcher(“新组件测试已成功注册”);
如果(m.matches()){
System.out.println(“万岁!”);
}
}
}

有没有可能
result.toString()
不是您认为的那样?

您的代码是任何东西,但不是php-在我看来更像java?另外,这不是因为转义,而是因为您没有指定捕获组。try
New Component(\w*)已成功注册。
很抱歉,您是对的,应该是java而不是phpI尝试了您建议的模式,但仍然不起作用,如果它在regexr中匹配,尽管我使用的模式应该可以,对吗?试试看-它还附带了一个方便的代码生成器函数,甚至支持java你的代码是什么,但不是php-在我看来更像java?另外,这不是因为转义,而是因为您没有指定捕获组。try
New Component(\w*)已成功注册。
很抱歉,您是对的,应该是java而不是phpI尝试了您建议的模式,但仍然不起作用,如果它在regexr中匹配,尽管我使用的模式应该可以,对吧?试试看-它还附带了一个方便的代码生成器函数,甚至支持Java将其更改为m。find修复了这个问题,所以感谢您!将其更改为m.find可以解决此问题,因此非常感谢!