RegEx - 获取未包装的元素数

时间:2012-08-15 16:08:41

标签: php regex

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

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

我想要计算':'然后将每个':'拆分以获得字符串。

这是我的正则表达式:

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

我不知道这是否是最好的解决方案,但它确实有效。 '。'之间有不同之处。和“[...]:[...]”所以我需要分开它们。我意识到我的正则表达式计算了:但是当:在...之间时继续。

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

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

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

这个正则表达式只是意味着: 搜索':' - 每一个想法都可以是无意义的,然后除了它之外,一个“在它前面,一个”在它之后。

也许你可以帮助我。

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

3 个答案:

答案 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。另请注意,巨大的字符串正则表达式会表现不佳。