在方案逃脱字符,正则表达式和方案
有"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\"")
这显然打破,因为它给你的分隔符,而不是他们之间有什么。但是由于这个正则表达式是一个字符范围,所以很容易解决 - 简单地否定字符范围,并得到你想要的: