1

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

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

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

4

3 回答 3

2

在等待 OP 进行编辑之前,我将假设唯一应该出现在拆分中的冒号是那些后跟简单的 ASCII 字母或数字的冒号。该解决方案可以很容易地推广。

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

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

结果是

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

split 函数表示“在后跟空格或单词字符(ASCII 字母或数字或下划线)的冒号上拆分”。

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

附录

另一个例子:

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

产生:

['this','has:(some%','   7colons:$','6')]
于 2012-06-14T06:07:14.893 回答
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

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

于 2012-06-14T06:04:46.267 回答
0

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

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

例如,如果您想要运算符:=、和=:,您可以编写::=:::

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

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

于 2012-06-14T06:13:13.080 回答