如何在groovy中解析多行记录?

时间:2014-03-05 16:13:01

标签: regex parsing groovy

我的日志文件包含两个地方的五个*。文件可能很大。

Log record
*****
Log record
Log record
*****
Log record

我想获得五个之间的所有内容*。是的,我可以逐行阅读,但也许有更好的解决方案,比如在Groovy中使用正则表达式进行解析?

谢谢。

3 个答案:

答案 0 :(得分:0)

试试这个正则表达式:

(?s)(?<=[*]{5}).+(?=[*]{5})

演示

http://groovyconsole.appspot.com/script/2405001

答案 1 :(得分:0)

此正则表达式匹配第一个*****和下一个(?<=\*{5})[\s\S]*(?=\*{5}) 之间的所有内容:

{{1}}

答案 2 :(得分:0)

您还可以编写自定义阅读器,如:

class DelimitedReader extends BufferedReader {
    String delimiterLine

    DelimitedReader( String delimiterLine, Reader reader ) {
        super( reader )
        this.delimiterLine = delimiterLine
        scanUntilDelimiter()
    }

    private scanUntilDelimiter() {
        String line = super.readLine()
        while( line != null && line != delimiterLine ) {
            line = super.readLine()
        }
    }

    String readLine() {
        String line = super.readLine()
        if( line == delimiterLine ) {
            line = null
        }
        line
    }
}

然后,你可以做这样的事情来迭代它们

new File( '/tmp/test.txt' ).withReader { r ->
    new DelimitedReader( '*****', r ).eachLine { line ->
        println line
    }
}

这可以节省您将整个文件加载到单个(可能很大的)字符串