我有一个像:
的字符串“嘿,我是彼得,我是一名软件工程师。我知道Java,我是RegEx的新手。”
我想从“彼得到新人”中提取所有人物。
来自gskinner.com/RegExr/我可以看到这种模式有效 - (?< = Hey)([^ \ n] *)(?= Reg)
但在Java中,它不起作用。任何人都可以帮忙吗?在Java中需要做些什么?
我的代码如下所示:
Pattern p = Pattern.compile("(?<=Hey)([^\n]*)(?=Reg)");
Matcher m = p.matcher(p);
m.find();
System.out.println(m.group(0));
当我跑步时,我得到一个异常,上面写着“找不到匹配”。
线程“main”中的异常java.lang.IllegalStateException:找不到匹配项 在java.util.regex.Matcher.group(Matcher.java:485)
答案 0 :(得分:4)
我假设你的字符串中有一个新行匹配,比如:
String stringWithPeter = "Hey I am Peter I work as a Software Engineer." +
System.getProperty("line.separator") + "I know Java and I am new to RegEx";
你希望在这个换行符中匹配。您可以告诉Java在匹配点(“。”)时包含换行符:
Pattern p = Pattern.compile("(?<=Hey)(.*)(?=Reg)", Pattern.DOTALL);
然后你会得到你正在寻找的行为。我还发现,当这个有效时:
String stringWithPeter = "Hey I am Peter I work as a Software Engineer.\nI know Java and I am new to RegEx";
Pattern p = Pattern.compile("(?<=Hey)([^\r]*)(?=Reg)");
但我完全不能告诉你原因。
答案 1 :(得分:1)
您在表达式中留下了未转义的\n
,它将作为换行符放入字符串中。
尝试:
Pattern p = Pattern.compile("(?<=Hey)([^\\n]*)(?=Reg)");
Matcher m = p.matcher(stringToMatch);
m.find();
System.out.println(m.group(0));
代替。
[还要注意用户Explosion Pills注意到p.matcher的参数也不正确]
答案 2 :(得分:0)
您可以在一行中完成所有操作:
String middle = str.replaceAll(".*(?<=Hey)([^\n]*)(?=Reg).*", "$1");
这是一个测试:
String str = "Hey I am Peter I work as a Software Engineer. I know Java and I am new to RegEx";
String middle = str.replaceAll(".*(?<=Hey)([^\n]*)(?=Reg).*", "$1");
System.out.println(middle);
输出:
I am Peter I work as a Software Engineer. I know Java and I am new to
请注意,使用此正则表达式获得相同的结果
String middle = str.replaceAll(".*(?<=Hey)(.*)(?=Reg).*", "$1");
你的正则表达式正在寻找一串字符,所有字符都是不是换行符。