Racket中括号内容的正则表达式

时间:2016-09-13 02:36:55

标签: regex scheme racket

如何在Racket中获取括号内容?内容可能有更多括号。我试过了:

(regexp-match #rx"((.*))" "(check)")

但输出有“(检查)”三次而不是一次:

'("(check)" "(check)" "(check)")

我只想“检查”而不是“(检查)”。

编辑:对于嵌套括号,应返回内部块。因此(a(1 2)c)应该返回“a(1 2)c”。

1 个答案:

答案 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)语法和朋友一样,但是球拍没有这个(还有???)