例如,我有一个这样的字符串:
first:second:third"test:test":fourth
我想要计算':'然后将每个':'拆分以获得字符串。
这是我的正则表达式:
/(.*):(.*)/iU
我不知道这是否是最好的解决方案,但它确实有效。 '。'之间有不同之处。和“[...]:[...]”所以我需要分开它们。我意识到我的正则表达式计算了:但是当:在...之间时继续。
我试图用这个正则表达式来解决这个问题:
/(((.*)[^"]):((.*)[^"]))/iU
我认为这是正确的方法,但事实并非如此。我试着学习正则表达式语法,但我不明白这个问题。
这个正则表达式只是意味着: 搜索':' - 每一个想法都可以是无意义的,然后除了它之外,一个“在它前面,一个”在它之后。
也许你可以帮助我。
编辑:我在PHP中使用我的正则表达式 - 也许这是一个重要的信息
答案 0 :(得分:4)
如何使用
$result = preg_split(
'/: # Match a colon
(?= # only if followed by
(?: # the following group:
[^"]*" # Any number of characters except ", followed by one "
[^"]*" # twice in a row (to ensure even number of "s)
)* # (repeated zero or more times)
[^"]* # followed by any number of non-quotes until...
$ # the end of the string.
) # End of lookahead assertion
/x',
$subject);
将为您提供结果
first
second
third"test:test"
fourth
直接?
此正则表达式仅在:
后才会分割,如果它后跟偶数引号。这意味着它不会在字符串中的:
上拆分:
答案 1 :(得分:2)
这个正则表达式应该这样做,如果它符合你的需要,你想要额外的解释,只要问:)
(?<=:|^)(?<!"[^:][^"]+:)\w+?(?=:|"|$)
那是我用过的测试字符串
&#34; TEST1:TEST2:TEST3&#34;:第一:第二:第三&#34; TEST1:TEST2:TEST3&#34;:第四:第五&#34; TEST1:TEST2:TEST3&#34;:第六< / p>
这些是以下6场比赛:
first
second
third
fourth
fifth
sixth
答案 2 :(得分:0)
我喜欢解析文字。所以我为你写了一个解析器。
$sample = 'first:second:third"test:test":fourth';
$len = strlen($sample);
$c =0;
$buffer="";
$output = array();
$instr = false;
for($i =0; $i< $len; $i++){
if($sample[$i]=='"' or $sample[$i]=="'"){
$c++;
$instr= $c%2==0 ? false: true;
$buffer.=$sample[$i];
}elseif(!$instr and $sample[$i]==':'){
$output[]=$buffer;
$buffer = "";
}else{
$buffer.=$sample[$i];
}
}
if($buffer) $output[] = $buffer;
print_r($output);
请参阅code in action。另请注意,巨大的字符串正则表达式会表现不佳。