2011-07-22 106 views
0

這一個有點複雜,我不知道是否可以完成。正則表達式在分隔符之間匹配,除非有冒號不在雙引號之間?

正則表達式需要匹配a,(逗號)或[](方括號)之間的所有內容。 它必須不匹配,如果有: 現在是棘手的部分。 如果:在「」之間可以匹配。

我設法創建了一個正則表達式,除了最後一個以外,它完成了一切。 (?< = [[,])[^:] +?(?= [],])

所以這就是它需要匹配的。
[ITEMNAME:數據,更多數據擁有多項 「爲:」 商品名稱]


我會繼續測試。讓我們看看是否有人解決它。

+0

嘗試添加'(「。*:。*」)?' –

+0

在一對逗號之間,或者在一個打開方括號和一個方括號之間,但是如果沒有冒號,除非冒號嵌入在一對雙引號內? '_With一個數字'如何:「item name_'匹配?據推測,我的表徵不夠準確......它應該在逗號或方括號之間,第二個逗號或方括號之間。但是,您還想要將第二個逗號計爲'_More Data_'上的關閉標記以及'_With ... name_'上的打開標記? –

+0

@Jonathan Leffler感謝新的頭銜。我沒有注意到它。它好多了。 –

回答

0

我在實踐中使用(perl)regexps有很好的經驗,所以讓我分享我的經驗。如果你正在處理這樣的複雜情況,除非你處於特殊的場合(例如執行速度至關重要),否則幾乎總是最好一步一步來做。

因此,在這種情況下,我會簡單地分兩步做。首先將數據爆炸成塊,即類似(取決於您的語言)

split(/[][,]/) 

而不是接受或刪除單個零件。在這種情況下只是刪除匹配這個表達式

其中包括分號 用括號包圍
/^([^"]*:.*|.*:[^"])$/ 

即零件,其零件。

顯然,這DEOS不能解決所有的情況下,像With a number "as: " : "item" name,但我同意傑里米,比如果你想實現複雜的語法語言,比它可能不只是扔在這幾個regexpes沒有更深層次的分析是正確的(即回答什麼應該接受像[ 1:1, 2":"2,3":":3,4":":":"4,5":":"5], ...奇怪的情況下),並使用適當的方法來解決它(遞歸語法分析器)

2

聽起來好像你正試圖指定一種真正複雜的語言來解析只使用正則表達式。這裏有一個符合你所描述的模式,但可能無法完美工作。它不使用後視,所以你需要選擇第一個匹配組來獲取內容。

/[\[,](("[^"\]]*"|[^:\[])*?)[\]\,]/ 
/[\[,] # Opening bracket or comma. 
(("[^"\]]*" # Anything not including the closing bracket, in quotes... 
    |[^:\[] # or not including the colon... 
))*?  # repeated any number of times. 
[\]\,]/x # Closing bracket or comma. 

一個例子使用在Python:

import re 

pattern = re.compile(r"""[\[,](("[^"\]]*"|[^:\[])*?)[\]\,]""", re.DEBUG) 

for match in pattern.finditer('[1 2 3] [4 5] [6 : 7], "8 : 9", '): 
    print match.group(1) 

產生輸出:

1 2 3 
4 5 
"8 : 9" 
+0

...並且Python的語法熒光筆和Perl都無法正確處理我的文章。可愛。 :P –

相關問題