【问题标题】:Match everything until a pattern匹配所有内容直到一个模式
【发布时间】:2015-01-29 14:15:25
【问题描述】:

我有以下正则表达式:

(?<time>[^ ]* [^ ]* ) (?<class>[^ ]+) *(?<level>[^ ]+)[ -]+(?<message>.*)

试图匹配一个 java 堆栈跟踪,其中的一个示例是:

2015-01-28 18:48:33,484  grails.plugin.jms.JmsGrailsPlugin                   INFO   - registering listener for 'sendPostLinkByEmailToUnbindedContacts' of service 'postCreatedActivityListener' to TOPIC 'post.created'
2015-01-28 18:48:35,569  sf.ehcache.config.ConfigurationFactory              WARN   - No configuration found. Configuring ehcache from ehcache-failsafe.xml  found in the classpath: jar:file:/var/lib/tomcat7/webapps/ws/WEB-INF/lib/ehcache-core-2.4.8.jar!/ehcache-failsafe.xml
2015-01-28 18:48:37,809  proxy.pojo.javassist.JavassistLazyInitializer       ERROR  - HHH000142: Javassist Enhancement failed: hibe.core.communication.feed.Post
java.lang.RuntimeException: duplicate method: attach in hibe.core.communication.feed.Post_$$_javassist_64
        at javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:509)
        at ...

请参阅Rubular Link 了解我的正则表达式和更完整的输入示例。

我的正则表达式工作正常,除了 message 组,它无法匹配整个消息:我需要 message 组来包含整个堆栈跟踪,直到下一个。知道其下一个是否为该格式的日期的模式:2015-01-28 18:48:33,484

可行吗?

【问题讨论】:

    标签: regex


    【解决方案1】:

    用途:

    • DOTALL 标志,所以点也匹配换行符
    • 前瞻消费,直到下一个日期戳,但不包括下一个日期戳
    • 不情愿量词*?,因此匹配不会消耗直到最后一个日期戳的所有输入

    像这样:

    (?<time>[^ ]* [^ ]* ) (?<class>[^ ]+) *(?<level>[^ ]+)[ -]+(?<message>.*?(?=\d{4}-\d\d-\d\d \d\d:\d\d:\d\d,\d{3}))
    

    demo

    【讨论】:

    • 非常感谢!有没有办法在没有多模式的情况下拥有它?
    猜你喜欢
    • 2022-09-24
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多