我想用冒号分割输入字符串。例如,a:int
。我可以[^:]*
用来获取a
and int
。
但是,我不希望字符串被包含冒号的任何组合拆分,例如A:=3:command
. 我想要的是A:=3
andcommand
但不是A
, =3
, command
。
有人可以告诉我如何编写正则表达式吗?
我想用冒号分割输入字符串。例如,a:int
。我可以[^:]*
用来获取a
and int
。
但是,我不希望字符串被包含冒号的任何组合拆分,例如A:=3:command
. 我想要的是A:=3
andcommand
但不是A
, =3
, command
。
有人可以告诉我如何编写正则表达式吗?
在等待 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')]
从表面上看,您希望在字符串的最后一个冒号上进行拆分,因此您希望尾随材料是一串非冒号,而前面的材料是任何东西。您也没有指定(在我回答问题时)您想要哪个正则表达式的子类(您正在使用哪种语言编写),所以您得到 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
显然,如果拆分规则不同(它不仅仅是“最后一个冒号”),那么模式将不得不改变。但这相当干净地达到了规定的要求。
除了 Ray 的回答之外,另一种选择是将您支持的运算符列入白名单,例如支持:=
(JavaScript 示例):
var s = "hello:world:=5:and:r";
var tokens = s.match(/(?:[^:]|:=)+/g);
例如,如果您想要运算符:=
、和=:
,您可以编写::=:
::
/(?:[^:]|:=|=:|:=:|::)+/g
(这可以简化为,但我认为它很容易维护)。