如何在Racket中获取括号内容?内容可能有更多括号。我试过了:
(regexp-match #rx"((.*))" "(check)")
但输出有“(检查)”三次而不是一次:
'("(check)" "(check)" "(check)")
我只想“检查”而不是“(检查)”。
编辑:对于嵌套括号,应返回内部块。因此(a(1 2)c)应该返回“a(1 2)c”。
答案 0 :(得分:0)
括号正在捕捉而不是匹配..因此#rx"((.*))"
会对所有内容进行两次捕捉。因此:
(regexp-match #rx"((.*))" "any text")
; ==> ("any text" "any text" "any text")
结果列表的第一个作为整个匹配,然后是第一组acpturnig paren,然后是第二组作为第二组..如果你想匹配括号,你需要逃避它们:
(regexp-match #rx"\\((.*)\\)" "any text")
; ==> #f
(regexp-match #rx"\\((.*)\\)" "(a (1 2) c)")
; ==> ("(a (1 2) c)" "a (1 2) c")
现在您看到第一个元素是整个匹配,因为匹配可能从搜索字符串中的任何位置开始,并在匹配最大的位置结束。第二个元素是唯一一个捕获。
如果字符串有其他括号集,则会失败。例如。
(regexp-match #rx"\\((.*)\\)" "(1 2 3) (a (1 2) c)")
; ==> ("(1 2 3) (a (1 2) c)" "1 2 3) (a (1 2) c")
这是因为表达式不能识别嵌套。要注意它,你需要递归调节器表达式,就像Perl中使用(?R)
语法和朋友一样,但是球拍没有这个(还有???)