【发布时间】:2015-12-27 04:39:15
【问题描述】:
以下正则表达式在测试here 时成功运行,但是当我尝试将它实现到我的 Java 代码中时,它不会返回匹配项。它使用负前瞻来确保MAIN LEVEL 和Bedrooms 之间不会出现换行符。为什么它不能在 Java 中工作?
正则表达式
^\s*\bMAIN LEVEL\b\n(?:(?!\n\n)[\s\S])*\bBedrooms:\s*(.*)
Java
pattern = Pattern.compile("^\\s*\\bMAIN LEVEL\\b\\n(?:(?!\\n\\n)[\\s\\S])*\\bBedrooms:\\s*(.*)");
match = pattern.matcher(content);
if(match.find())
{
//Doesn't reach here
String bed = match.group(1);
bed = bed.trim();
}
content 只是从文本文件中读取的字符串,其中包含上面链接的演示中显示的确切文本。
File file = new File("C:\\Users\\ME\\Desktop\\content.txt");
content = new Scanner(file).useDelimiter("\\Z").next();
更新:
我更改了我的代码以包含多行修饰符 (?m),但它打印出“null”。
pattern = Pattern.compile("(?m)^\\s*\\bMAIN LEVEL\\b\\n(?:(?!\\n\\n)[\\s\\S])*\\bBedrooms:\\s*(.*)");
match = pattern.matcher(content);
if(match.find())
{ // Still not reaching here
mainBeds=match.group(1);
mainBeds= mainBeds.trim();
}
System.out.println(mainBeds); // Prints null
【问题讨论】:
-
在开头添加多行修饰符
(?m).. -
即
Pattern.compile("(?m)^\\s*\\bMAIN LEVEL\\b\\n(?:(?!\\n\\n)[\\s\\S])*\\bBedrooms:\\s*(.*)"); -
感谢@AvinashRaj,但它正在返回
null。我已经更新了我的问题以反映这些变化。有什么想法吗?? -
如果我只是使用
pattern = Pattern.compile("Bedrooms:\\s(\\d+)");,那么它会正确打印666。 -
是
matchMatcherobj?Matcher match = pattern.matcher(content);
标签: java regex pattern-matching negative-lookahead