我想获取由冒号分割的输入字符串。例如,a:int
。我可以使用[^:]*
获取a
和int
。
但是,我不希望String包含任何包含冒号的组合,例如A:=3:command
。我想要的是A:=3
和command
但不是A
,=3
,command
。
有人能告诉我如何编写正则表达式吗?
答案 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
(这可以简化为,但我认为它很容易维护)。