如何为这种情况编写此正则表达式?

时间:2012-06-14 05:48:46

标签: regex

我想获取由冒号分割的输入字符串。例如,a:int。我可以使用[^:]*获取aint

但是,我不希望String包含任何包含冒号的组合,例如A:=3:command。我想要的是A:=3command但不是A=3command

有人能告诉我如何编写正则表达式吗?

3 个答案:

答案 0 :(得分:2)

在OP编辑之前,我将假设应该出现在分割中的唯一冒号是后面跟着简单的ASCII字母或数字的冒号。解决方案很容易推广。

这是JavaScript中的一个具体示例:

s = "x:=3:comment"
s.split(/:(?=[\s\w])/)

结果是

['x:=3','comment']

拆分功能说“拆分冒号后跟空格或字符(ASCII字母或数字或下划线)”。

其他语言具有更强大的外观形式(特别是负面外观),但基本思想是构造一个正则表达式,其中分割值是特定上下文中的冒号

<强>附录

另一个例子:

"this:has:(some%:   7colons:$:6)".split(/:(?=[\s\w])/)

产生

['this','has:(some%','   7colons:$','6')]

答案 1 :(得分:1)

在它的表面上,你想要拆分字符串中的最后一个冒号,所以你希望尾随材料是一个非冒号的字符串,前面的材料是任何东西。你也没有指明(在我回答问题的时候)你想要哪种正则表达式(你正在写的是哪种语言),所以你得到Perl作为我的答案。

#!/usr/bin/env perl
use strict;
use warnings;

my @array = ( "a:int", "A:=3:comment" );

foreach my $item (@array)
{
    my($prefix, $suffix) = $item =~ m/^(.*):([^:]+)$/;
    print "$prefix and $suffix\n";
}

该脚本的输出是:

a and int
A:=3 and comment

显然,如果拆分的规则不同(它不仅仅是'最后一个冒号'),那么模式将不得不改变。但这可以合理地完成所要求的要求。

答案 2 :(得分:0)

除了Ray的回答之外,另一个选择是将您支持的运算符列入白名单,例如,支持:=(JavaScript示例):

var s = "hello:world:=5:and:r";
var tokens = s.match(/(?:[^:]|:=)+/g);

例如,如果您想要运营商:==::=:::,您可以写一下:

/(?:[^:]|:=|=:|:=:|::)+/g

(这可以简化为,但我认为它很容易维护)。