2011-05-21 70 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\"") 

这显然打破,因为它给你的分隔符,而不是他们之间有什么。但是由于这个正则表达式是一个字符范围,所以很容易解决 - 简单地否定字符范围,并得到你想要的:

​​