Regex Perl-两个冒号之间的匹配字符串

Regex Perl-两个冒号之间的匹配字符串,regex,perl,Regex,Perl,我的绳子看起来像这样 important stuff: some text 2: some text 3. 我只想打印“重要的东西”。所以基本上我想把所有内容打印到第一个冒号。我相信这很简单,但我的regex-foo不太好 编辑:对不起,我做了一些愚蠢的事情,给了你一个很糟糕的例子。它已被更正。好吧,假设它是一个字符串 $test = "sass sg22gssg 22222 2222: important important :" Assume you want all charac

我的绳子看起来像这样

important stuff: some text 2: some text 3.
我只想打印“重要的东西”。所以基本上我想把所有内容打印到第一个冒号。我相信这很简单,但我的regex-foo不太好


编辑:对不起,我做了一些愚蠢的事情,给了你一个很糟糕的例子。它已被更正。

好吧,假设它是一个字符串

$test = "sass sg22gssg 22222 2222:  important  important  :"

Assume you want all characters between.

Wrong answer: $test =~ /:(.+):/;  # thank you for the change from .{1,}

Corrected. 
$test =~ /:([^:]*):/; 

print $1; #perl  memory u can assign to a string ;
$found=$1

作为perl中正则表达式的备忘单


我做了测试。

好吧,假设它是一个字符串

$test = "sass sg22gssg 22222 2222:  important  important  :"

Assume you want all characters between.

Wrong answer: $test =~ /:(.+):/;  # thank you for the change from .{1,}

Corrected. 
$test =~ /:([^:]*):/; 

print $1; #perl  memory u can assign to a string ;
$found=$1

作为perl中正则表达式的备忘单


我做了测试。

只需将您匹配的内容限制为非冒号,
[^::]*
。注意,
^
边界实际上并不需要,但它们有助于记录正则表达式背后的意图

my $text = "important stuff: some text 2: some text 3."

if ($text =~ /^([^:]*):/) {
    print "$1";
}

只需将您要匹配的内容限制为非冒号,
[^::]*
。注意,
^
边界实际上并不需要,但它们有助于记录正则表达式背后的意图

my $text = "important stuff: some text 2: some text 3."

if ($text =~ /^([^:]*):/) {
    print "$1";
}

考虑在冒号上进行拆分:

use strict;
use warnings;

my $string = 'important stuff: some text 2: some text 3.';
my $important = ( split /:/, $string )[0];
print $important;
输出:

important stuff

考虑在冒号上进行拆分:

use strict;
use warnings;

my $string = 'important stuff: some text 2: some text 3.';
my $important = ( split /:/, $string )[0];
print $important;
输出:

important stuff


如果你想匹配多个:x:matches,它会变得有点复杂,g可以反复匹配并从中获得一个数组。
{1,}
通常被指定为
+
。如果有换行符,则需要/s标志来匹配
them@hypnotoad:不应该,除非第一组冒号之间有换行符。如果有,请改为执行
/:(.+):/s
(或者执行
/:([^:]*):/
,就像在另一个答案中一样)抱歉,伙计们,我给了你们一个错误的示例行。当我使用我最初的示例时,它工作正常。实际上我需要它来匹配第一个冒号。谢谢你迄今为止的帮助@alexmac如果您进行了非贪婪匹配,您的第一个正则表达式就会起作用,
:(.*):
我个人喜欢限制匹配值的允许字符集,而不仅仅依赖于边界条件,由于这通常更快,也不太容易出现简单错误,例如忘记执行非贪婪与贪婪。如果要匹配多个:x:matches,则会变得更复杂,g可以反复匹配并从中获取数组。
{1,}
通常只指定为
+
。如果有换行符,则需要/s标志来匹配
them@hypnotoad:不应该,除非第一组冒号之间有换行符。如果有,请改为执行
/:(.+):/s
(或者执行
/:([^:]*):/
,就像在另一个答案中一样)抱歉,伙计们,我给了你们一个错误的示例行。当我使用我最初的示例时,它工作正常。实际上我需要它来匹配第一个冒号。谢谢你迄今为止的帮助@alexmac如果您进行了非贪婪匹配,您的第一个正则表达式就会起作用,
:(.*):
我个人喜欢限制匹配值的允许字符集,而不仅仅依赖于边界条件,因为这通常更快,也不太容易犯简单的错误,比如忘记做非贪婪和贪婪。对不起,我给了你一个不好的例子。当我使用我最初的示例时,它工作正常。实际上我需要它来匹配第一个冒号。谢谢你迄今为止的帮助!你在我的散列编辑中击败了我,所以我也给了你一票。@hypnotoad我已经为你修订的规范编辑了回复。唯一需要更改的是边界条件。很抱歉,我给了你一个不好的示例行。当我使用我最初的示例时,它工作正常。实际上我需要它来匹配第一个冒号。谢谢你迄今为止的帮助!你在我的散列编辑中击败了我,所以我也给了你一票。@hypnotoad我已经为你修订的规范编辑了回复。唯一需要更改的是边界条件。+1是最有效的答案的十倍。它与
$important=substr$string,0,index($string,,:')相当,但更完美。;)@大卫-感谢你的评论。谢谢。我忘了提一下,请使用split的第三个参数使split在找到冒号后停止工作:
(split/:/,$string,2)[0]
。(这是我测试时做的。)+1表示最有效的答案,乘以10。它与
$important=substr$string,0,index($string,,:')相当,但更完美。;)@大卫-感谢你的评论。谢谢。我忘了提一下,请使用split的第三个参数使split在找到冒号后停止工作:
(split/:/,$string,2)[0]
。(我测试时就是这么做的。)