在方案逃脫字符,正則表達式和方案
有"hello hellu-#\"hella.helloo,hallo#\return#\""
串
我想列出他們作爲(「你好」「hellu」「海拉」「helloo」,「你好」)
的空間,連字符,雙引號,點,逗號分隔,返回
我試圖
(regexp-split #rx"(+)|(#\-)|(#\")|(#\.)|(,)|(#\return)" string)
但#\- , #\.
出錯
任何提示或解決方案?
感謝
在方案逃脫字符,正則表達式和方案
有"hello hellu-#\"hella.helloo,hallo#\return#\""
串
我想列出他們作爲(「你好」「hellu」「海拉」「helloo」,「你好」)
的空間,連字符,雙引號,點,逗號分隔,返回
我試圖
(regexp-split #rx"(+)|(#\-)|(#\")|(#\.)|(,)|(#\return)" string)
但#\- , #\.
出錯
任何提示或解決方案?
感謝
它看起來像你混淆了語法字符串的字符的語法(#\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\"")
這顯然打破,因爲它給你的分隔符,而不是他們之間有什麼。但是由於這個正則表達式是一個字符範圍,所以很容易解決 - 簡單地否定字符範圍,並得到你想要的: