0

我知道这已经讨论过很多次了,但是我尝试了很多方法来让我的正则表达式从多行中读取信息,但没有一个有效。这是我正在尝试做的事情:

我有一个文本文件。里面写着:

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],似乎没有任何效果。
任何帮助将不胜感激。这是迈向更大的个人项目的一小步。

4

2 回答 2

3

这应该工作

(?s)(?<=Description1\\s).*?(?=\\sDescription2)
 ^                       ^            

(?s).匹配换行符

.*?会懒惰地匹配..即它会尽可能少地匹配..这是因为.*你会结束匹配直到最后一个 Decription2

于 2013-10-01T17:15:11.507 回答
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.DOTALLflag 而不是.可以使用[\\s\\S]which 将匹配任何空白和非空白字符。同样的规则也适用于其他类角色,如[\\d\\D]

于 2013-10-01T17:14:51.053 回答