【发布时间】:2014-04-17 11:27:16
【问题描述】:
我正在寻找一个正则表达式,它收集最后一个冒号 (:) 和它之前的第一个空格之间的所有内容。所以如果我有句"HUHweg: 4ihfw:euigr yalalala:"我想收集"yalalala"。
我想出了" (?<content>)/[^:]*$",但内容组是空的。我希望空格 后跟内容直到最后一个:($)可以工作,但它没有。如何让它发挥作用?
【问题讨论】:
我正在寻找一个正则表达式,它收集最后一个冒号 (:) 和它之前的第一个空格之间的所有内容。所以如果我有句"HUHweg: 4ihfw:euigr yalalala:"我想收集"yalalala"。
我想出了" (?<content>)/[^:]*$",但内容组是空的。我希望空格 后跟内容直到最后一个:($)可以工作,但它没有。如何让它发挥作用?
【问题讨论】:
您还没有走远...尝试使用(这里我使用~ 作为正则表达式分隔符)
~ (?<content>[^ :]*):\s*$~
捕获组必须拥有要捕获的东西。另外你需要在内容中禁止空格,否则你可能会在你想要的部分之前抓住一些单词。
\s 是所有类型空格(空格、制表符、换行符...)的快捷方式,将捕获最后一列之后有尾随空格的情况。
见demo
【讨论】:
"2014-04-13 01:32:36.246 Request ThisIsAMethod: ",我想收集ThisIsAMethod。
$ 匹配字符串的结尾,因此正则表达式确实不匹配。这是你所有的字符串,还是后面还有一个换行符?
(?<content>[^ :]*) :$ 它可以工作。 :-) 谢谢!
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); (?=[^\:]*) 没有任何意义(“后跟零个或多个任何东西”总是正确的);并且没有任何东西需要匹配空间。
(?=[^:]*) 表示可以匹配除冒号以外的零个或多个字符;即使下一个字符是冒号,它也会成功。如果你想说后面没有冒号,你必须锚定它:(?=[^:]*$)。 2. 在大多数风格中匹配任何字符(包括换行符)的最佳方法是使用 . 并设置单行/DOTALL 标志。在 PHP 和 .NET 中,您可以通过在正则表达式的开头添加 (?s) 来做到这一点。 3. \s 匹配任何空白字符;要匹配空格,您应该使用空格。