2

例如我有一个这样的字符串:

first:second:third"test:test":fourth

我想计算 ':' 并稍后拆分每个 ':' 以获取字符串。

这是我的正则表达式:

/(.*):(.*)/iU

我不知道这是否是最好的解决方案,但它确实有效。'.' 之间有区别。和 "[...] : [...]" 所以我需要将它们分开。我意识到我的正则表达式计算 : 但当 : 介于“.

我试图用这个正则表达式解决这个问题:

/(((.*)[^"]):((.*)[^"]))/iU

我认为这是正确的方法,但事实并非如此。我试图学习正则表达式语法,但我不明白这个问题。

这个正则表达式只是意味着:搜索':' - 每个想法都可以是infornt并且在它之后,除了“在它前面并且”在它之后。

也许你可以帮助我。

编辑:我在 PHP 中使用我的正则表达式 - 也许这是一个重要信息

4

3 回答 3

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

直接地?

:此正则表达式仅在其后跟偶数个引号时才拆分。这意味着它不会在:字符串内部拆分:

于 2012-08-15T16:13:45.770 回答
2

这个正则表达式应该可以做到,如果它符合您的需求并且您需要额外的解释,请询问:)

(?<=:|^)(?<!"[^:][^"]+:)\w+?(?=:|"|$)

那是我使用的测试字符串

"test1:test2:test3":first:second:third"test1:test2:test3":fourth:fifth"test1:test2:test3":sixth

这些是以下6场比赛:

first
second
third
fourth
fifth
sixth
于 2012-08-15T19:27:29.530 回答
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);

请参阅实际代码。另请注意,对于巨大的字符串正则表达式将表现不佳。

于 2012-08-15T16:22:12.097 回答