2012-06-14 73 views
1

我想得到由冒号分割的输入字符串。例如,a:int。我可以用[^:]*得到aint如何为这种情况编写正则表达式?

但是,我不希望字符串被包含冒号的任何组合拆分,如A:=3:command。我想要的是A:=3command,但不是A,=3command

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

+2

这是非常本地化,不太可能对许多人有用。投票结束。 –

+3

那么哪些冒号可以分开,哪些不是?你应该在冒号后面加上等号不会分裂,但是在其他情况下你的冒号是不可拆分的吗?你能否准确地确定你想要的条件? –

+0

你的分割功能是如何工作的?你的第一个正则表达式将匹配任何非冒号字符。如果我拆分字符串,我将只得到冒号... – matcauthon

回答

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

表面上,你想分割字符串中的最后一个冒号,所以你希望尾随材料是一个非冒号的字符串,前面的材料是任何东西。你也没有指定(在我回答问题的时候)你想要哪个子类的正则表达式(你正在写什么语言),所以你得到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 

显然,如果拆分规则是不同的(它不是简单的“最后一个冒号”),那么该模式将不得不更改。但是这相当干净地达到了所述的要求。

0

除了雷人的回答,另一个选择是到白名单你支持的运营商,例如,以支持:=(JavaScript示例):

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

例如,如果你想经营:==::=:::,你可以写:

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

(这可以简化,但我认为这是易于维护)。