正则表达式可在Notepad ++中运行,但不能在Java中运行

时间:2019-05-31 01:27:36

标签: java regex

好吧,所以我正在解决一个我想用正则表达式解决的问题,我在Notepad ++中测试了我的大多数正则表达式,在经过一些调整(例如对Java的某些内容进行了两次转义)之后,这种方法仍然可以正常工作,但是regex表达式在Java中运行时会引发异常,但是在Notepad ++中运行则很好,这是如果此代码能够在游戏中使用突出显示的名称来提及其他玩家的想法。

tldr;我正在尝试替换邮件中首次出现的特定名称

我尝试了一段时间,但没有找到解决方案,所以我想我也可以在这里问。

p.getName()仅返回一个字符串(玩家名称)

String newmessage = message.replaceFirst("(?i)" + Pattern.quote(p.getName()) + "((?(?=\\s)|('|,|!))|$)", color + p.getName() + Color.toString(Color.getLastColorOf(message)));

但是执行代码会引发此异常 ...at java.lang.Thread.run(Unknown Source) [?:1.8.0_202] Caused by: java.util.regex.PatternSyntaxException: Unknown inline modifier near index 15 (?i)\QTauCubed\E((?(?=\s)|('|,))|$) ^ at java.util.regex.Pattern.error(Unknown Source) ~[?:1.8.0_202]...

我不确定它要我做什么,我看不到这不是无效的正则表达式

这是Notepad ++的正则表达式

(?i)Name((?(?=\s)|('|,|!))|$)

以上将匹配

Name's r
Name
Name test
Name,
Name!

但不匹配

Nametest

这就是我想要的。

1 个答案:

答案 0 :(得分:1)

我投票赞成仅将模式\bName\bString#replaceFirst一起使用:

String input = "Rename here is a Name and here is the same Name again.";
input = input.replaceFirst("\\bName\\b", "blah");
System.out.println(input);

此打印:

Rename here is a blah and here is the same Name again.