2012-08-15 48 views
2

例如元素的計數我有一個字符串是這樣的:正則表達式 - 得到未包裹

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

我要算「:」後來分裂每一個「:」得到的字符串。

這是我的正則表達式:

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

我不知道這是不是最好的解決辦法,但它的工作原理。 '。'之間有一個不同。和「[...]:[......]」,所以我需要把它們分開。我意識到,我的正則表達式計數:但繼續當:介於」

我試圖用這個正則表達式來解決這個問題:

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

我認爲這是正確的方式,但它不是。我試圖學習正則表達式的語法,但我不明白這個問題。

這個正則表達式只是意味着: 搜索':' - 每一個想法可以是信息,並且在它之後除了wehen之外「一個」在它和一個「是在它之後。

也許你可以幫忙 我。

編輯:我用我的正則表達式在PHP - 也許這是一個重要的信息

回答

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 

直接?

這個正則表達式在:上分開,前提是後面跟着偶數個引號。這意味着它不會在:字符串內分割:

+0

謝謝!我將使用你的正則表達式,並試圖瞭解爲什麼你的正則表達式會做它的功能;) – TJR 2012-08-15 16:15:22

+0

@TimoRütten:我已經將它轉換爲冗長的正則表達式。希望這更清楚。 – 2012-08-15 16:18:34

+0

是的!很有幫助!謝謝 - 我期待着理解語法和幹中學!謝謝蒂姆! – TJR 2012-08-16 08:51:40

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。還要注意,對於巨大的字符串正則表達式將表現不佳

2

此正則表達式應該這樣做,如果它符合您的需求,您需要更多的解釋,只是問:)

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

這是我用

測試字符串「測試1:測試2:TEST3 「:第一:第二:第三」 測試1:TEST2:TEST3 「:第四:第五」 測試1:TEST2:TEST3" :第六

這些是6以下匹配:

first 
second 
third 
fourth 
fifth 
sixth