2011-05-21 71 views
3

在方案逃脫字符,正則表達式和方案

"hello hellu-#\"hella.helloo,hallo#\return#\""

我想列出他們作爲(「你好」「hellu」「海拉」「helloo」,「你好」)

的空間,連字符,雙引號,點,逗號分隔,返回

我試圖

(regexp-split #rx"(+)|(#\-)|(#\")|(#\.)|(,)|(#\return)" string) 

#\- , #\.出錯

任何提示或解決方案?

感謝

回答

3

它看起來像你混淆了語法字符串的字符的語法(#\foo),和你這樣做的字符串和正則表達式兩種。所以我的猜測是,要分割字符串居然是:

"hello hellu-\"hella.helloo,hallo\n\"" 

其中\"代表雙引號字符,並\n一個換行符。如果是這樣的話,那麼(同樣,這在猜測你的意圖)的正則表達式應該是:

(regexp-split #rx"(+)|(\-)|(\")|(\.)|(,)|(\n)" string) 

但是,這也不行,因爲\-\.無效逃逸(球拍使用的類C逃逸),所以它改成:

(regexp-split #rx"(+)|(-)|(\")|(.)|(,)|(\n)" string) 

這也不管用,因爲.有慣用的「任何字符」的正則表達式的意思 - 所以你想用一個反斜槓逃脫它。與許多其它字符串語法,你用一個反斜槓它得到一個反斜槓,所以現在我們有一個版本終於接近工作之一:

> (define string "hello hellu-\"hella.helloo,hallo\n\"") 
> (regexp-split #rx"(+)|(-)|(\")|(\\.)|(,)|(\n)" string) 
'("hello" "hellu" "" "hella" "helloo" "hallo" "" "") 

首先,正則表達式可以顯着改善:不需要括號進行分割:

(regexp-split #rx" +|-|\"|\\.|,|\n" string) 

然後,而不是用一堆的單字符| S,你可以使用「字符範圍」:

(regexp-split #rx" +|[-\".,\n]" string) 

請注意,-是該範圍中的第一個(或最後一個)字符,這一點很重要,所以它不具有通常意義上的一系列字符。接下來,看來你真的想這樣的任何字符序列用作分隔符,這將避免一些結果中的那些空字符串:

(regexp-split #rx" +|[-\".,\n]+" string) 

在這種情況下,你可以一樣好扔空間也進入範圍(仔細地把它-,如我上面解釋)。我們現在得到:

> (define string "hello hellu-\"hella.helloo,hallo\n\"") 
> (regexp-split #rx"[- \".,\n]+" string) 
'("hello" "hellu" "hella" "helloo" "hallo" "") 

最後你可能想擺脫最後一個空字符串。從技術上講,它應該在那裏,因爲在字符串結尾之前有一系列匹配字符。在解決此拍一個簡單的方法是使用互補regexp-match*返回的比賽的列表,而不是比賽的名單上的分裂:

> (define string "hello hellu-\"hella.helloo,hallo\n\"") 
> (regexp-match* #rx"[- \".,\n]+" string) 
'(" " "-\"" "." "," "\n\"") 

這顯然打破,因爲它給你的分隔符,而不是他們之間有什麼。但是由於這個正則表達式是一個字符範圍,所以很容易解決 - 簡單地否定字符範圍,並得到你想要的:

​​