【问题标题】:What is a regex for matching everything between last colon and the first space before it?什么是匹配最后一个冒号和它之前的第一个空格之间的所有内容的正则表达式?
【发布时间】:2014-04-17 11:27:16
【问题描述】:

我正在寻找一个正则表达式,它收集最后一个冒号 (:) 和它之前的第一个空格之间的所有内容。所以如果我有句"HUHweg: 4ihfw:euigr yalalala:"我想收集"yalalala"

我想出了" (?<content>)/[^:]*$",但内容组是空的。我希望空格 后跟内容直到最后一个:$)可以工作,但它没有。如何让它发挥作用?

【问题讨论】:

    标签: .net regex


    【解决方案1】:

    您还没有走远...尝试使用(这里我使用~ 作为正则表达式分隔符)

    ~ (?<content>[^ :]*):\s*$~
    

    捕获组必须拥有要捕获的东西。另外你需要在内容中禁止空格,否则你可能会在你想要的部分之前抓住一些单词。

    \s 是所有类型空格(空格、制表符、换行符...)的快捷方式,将捕获最后一列之后有尾随空格的情况。

    demo

    【讨论】:

    • 仍然没有返回任何内容。如果我删除 $ 它会返回第一个 : 之前的所有内容,直到空格。
    • 更准确地说:我有:"2014-04-13 01:32:36.246 Request ThisIsAMethod: ",我想收集ThisIsAMethod
    • @user2609980 是的,您的问题是尾随空格...$ 匹配字符串的结尾,因此正则表达式确实不匹配。这是你所有的字符串,还是后面还有一个换行符?
    • 太棒了!确实是尾随空格。如果我这样做(?&lt;content&gt;[^ :]*) :$ 它可以工作。 :-) 谢谢!
    • @user2609980:我进行了编辑以添加更一般的答案。很高兴我能帮上忙!
    【解决方案2】:

    PHP代码(我认为可以很容易地转换成其他语言)

    <?php
    $patterns=array('/(.|\s)*(\s)((.[^:])*)(\:)(?=[^\:]*)/');
    $replacements=array(' $3 ');
    $string='HUHweg: 4ihfw:euigr yalalala: ';
    
    echo preg_replace($patterns,$replacements,$string);
    ?>
    
    Result: yalalala
    

    首先是任意数量的任何炭或白炭。然后正好是一个空白。然后是我们的字符串,它被捕获为$3。接下来是冒号,然后是匹配任何字符但不匹配冒号的语句:)

    【讨论】:

    • 不,这是完全错误的。 (.|\s) 是匹配任何字符(包括换行符)的最坏方法(解释为 here); (?=[^\:]*) 没有任何意义(“后跟零个或多个任何东西”总是正确的);并且没有任何东西需要匹配空间。
    • 我添加了我正在写的空间。 ?=[^\:]* 是 0 个或多个除空格以外的符号。我不知道有什么更好的方法来匹配除 (.|\s)* 以外的任何符号,包括空格和/或换行符,但也许你可以提出一些建议?:)) 在我的情况下 (.|\n) 从未按预期工作
    • 1. (?=[^:]*) 表示可以匹配除冒号以外的零个或多个字符;即使下一个字符是冒号,它也会成功。如果你想说后面没有冒号,你必须锚定它:(?=[^:]*$)2. 在大多数风格中匹配任何字符(包括换行符)的最佳方法是使用 . 并设置单行/DOTALL 标志。在 PHP 和 .NET 中,您可以通过在正则表达式的开头添加 (?s) 来做到这一点。 3. \s 匹配任何空白字符;要匹配空格,您应该使用空格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2017-10-28
    • 2022-01-05
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多