我想得到由冒号分割的输入字符串。例如,a:int
。我可以用[^:]*
得到a
和int
。如何为这种情况编写正则表达式?
但是,我不希望字符串被包含冒号的任何组合拆分,如A:=3:command
。我想要的是A:=3
和command
,但不是A
,=3
,command
。
有人能告诉我如何编写正则表达式吗?
我想得到由冒号分割的输入字符串。例如,a:int
。我可以用[^:]*
得到a
和int
。如何为这种情况编写正则表达式?
但是,我不希望字符串被包含冒号的任何组合拆分,如A:=3:command
。我想要的是A:=3
和command
,但不是A
,=3
,command
。
有人能告诉我如何编写正则表达式吗?
我打算假设,在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')]
表面上,你想分割字符串中的最后一个冒号,所以你希望尾随材料是一个非冒号的字符串,前面的材料是任何东西。你也没有指定(在我回答问题的时候)你想要哪个子类的正则表达式(你正在写什么语言),所以你得到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
显然,如果拆分规则是不同的(它不是简单的“最后一个冒号”),那么该模式将不得不更改。但是这相当干净地达到了所述的要求。
除了雷人的回答,另一个选择是到白名单你支持的运营商,例如,以支持:=
(JavaScript示例):
var s = "hello:world:=5:and:r";
var tokens = s.match(/(?:[^:]|:=)+/g);
例如,如果你想经营:=
,=:
,:=:
和::
,你可以写:
/(?:[^:]|:=|=:|:=:|::)+/g
(这可以简化,但我认为这是易于维护)。
这是非常本地化,不太可能对许多人有用。投票结束。 –
那么哪些冒号可以分开,哪些不是?你应该在冒号后面加上等号不会分裂,但是在其他情况下你的冒号是不可拆分的吗?你能否准确地确定你想要的条件? –
你的分割功能是如何工作的?你的第一个正则表达式将匹配任何非冒号字符。如果我拆分字符串,我将只得到冒号... – matcauthon