我知道这已经讨论了很多次了,但是我已经尝试了很多方法让我的正则表达式从多行读取信息而没有用。这是我想要做的:
我有一个文本文件。里面写着:
Description1 This is a test description. Yay. Description2
正则表达式(?<=Description1\\s).*(?=\\sDescription2)
按原样返回所有文本,但不包括单词Description1和Description2。
但是,即使其中的文本被另一行分隔,我也需要能够做同样的事情。像这样。
Description1 This is a
test description. Yay. Description2
我已经尝试了我能找到的所有内容,从Pattern.MULTILINE
标记到Pattern.DOTALL
,添加(?s)
到开头,添加[/r/n]
,似乎没有工作。
任何帮助将不胜感激。这是一个更大的个人项目的一小步。
答案 0 :(得分:3)
这应该有效
(?s)(?<=Description1\\s).*?(?=\\sDescription2)
^ ^
(?s)
会使.
与新线匹配
.*?
会与lazily匹配。因为它会尽可能少地匹配。这是因为.*
你将结束匹配,直到最后一个Decription2
答案 1 :(得分:2)
Pattern.DOTALL
似乎做你想做的事。同样Anirudh在他的回答中提到(+1为他),你可能希望.*
在?
之后添加String input = "Description1 This is a \ntest description. Yay. Description2";
Pattern p = Pattern.compile("(?<=Description1\\s).*?(?=\\sDescription2)", Pattern.DOTALL);
Matcher m = p.matcher(input);
while (m.find()) {
System.out.println(m.group());
}
。
This is a
test description. Yay.
输出:
Pattern.DOTALL
如果您不想使用.
标志而不是[\\s\\S]
,则可以使用[\\d\\D]
来匹配任何空格和非空白字符。同样的规则适用于其他类字符,例如{{1}}