【问题标题】:finding text until end of line regex查找文本直到行尾正则表达式
【发布时间】:2011-10-24 05:10:15
【问题描述】:

我正在尝试使用正则表达式来查找特定的起始字符,然后获取该特定行上的其余文本。

例如文本可以是...

V:中音 T:节奏

我想用正则表达式来抓取“V:”和它后面的文字。

有没有什么好的、快速的方法可以使用正则表达式来做到这一点?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    如果你的起始字符是固定的,你会创建一个像这样的模式:

    Pattern vToEndOfLine = Pattern.compile("(V:[^\\n]*)")
    

    并使用find() 而不是matches()

    如果你的起始字符是动态的,你总是可以编写一个方法来返回所需的模式:

    Pattern getTailOfLinePatternFor(String start) {
        return Pattern.compile("(" + start + "[^\\n]*");
    }
    

    这些可以根据您的需要进行一些工作。

    【讨论】:

      【解决方案2】:

      对于模式匹配,请尝试您的示例:

      V:.*$

      【讨论】:

        【解决方案3】:

        这是最好、最干净、最简单(即单行)的方法:

         String[] parts = str.split("(?<=^\\w+): ");
        

        解释:

        正则表达式在第一个单词(在本例中为“V”)之后的“:”处使用正则表达式中断并捕获两半。

        这是一个测试:

        String str = "V: mid-voice T: tempo";
        String[] parts = str.split("(?<=^\\w+): ");
        System.out.println("key = " + parts[0] + "\nvalue = " + parts[1]);
        

        输出:

        key = V
        value = mid-voice T: tempo
        

        【讨论】:

        • 这真的有效吗? As far as I know,Java 不支持无限长的lookbehind 断言。
        • @TimPietzcker 有用吗??是的,它有效!这是一个非常基本的外观 - 它与^ 锁定在行首,所以它最多只会命中一次。将测试代码复制粘贴到 main 中,然后运行它并使用一些边缘案例来亲自查看。
        • 这很有趣。 Java 正则表达式引擎是否仅在它们被这样锚定时才支持无限长度的后向断言,或者它是否通常这样做,并且我上面链接到的站点(以及关于 SO 的许多答案)是错误的并且需要更新?跨度>
        • @TimPietzcker 我做了一些研究并编写了测试来检查......你是对的 - 尝试在 java 中使用无限后视会产生:PatternSyntaxException: Look-behind group does not have an obvious maximum length。也就是说,这种向后看是可以的(没有错误)。此外,移除锚点以仅留下"(?&lt;=\\w+): "仍然可以,尽管从技术上讲它是无限长的。通过测试,我得出结论,对于 java,不允许的后视使用具有常量后跟“任意长度”匹配的正则表达式:即 (?&lt;=x[\w]*) not OK,(?&lt;=[\w]*x) is 好的。有趣!
        • 我在 SO 上发现了一个问题,解释了为什么会这样:stackoverflow.com/questions/1536915/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-25
        • 1970-01-01
        • 2012-03-19
        • 1970-01-01
        • 1970-01-01
        • 2017-08-07
        相关资源
        最近更新 更多