我一直在尝试在一个文本文件中使用正则表达式,该文件中充满了由行尾字符\n
分隔的随机单词。(以最简单和最直观的方式),并使用regex打印长度为6的文件中不包含某个字母的所有单词(在这个例子中是字母t)。下面你可以看到我是如何读取文件的,但是我不确定如何使用它的结果列表,因为缺少变量。另外,你可以看到下面我用regex做了一个测试,结果是'当我实际上希望返回单词grumpy
和foobar
(不包括stumpy
)时,s的真实结果是#f
。
#lang racket
(require 2htdp/batch-io)
(require racket/match)
;(file->string "words.txt");;reads in a file to a string
;(file->list "words.txt);; reads in a file to a list
(define (listMatches)
(regexp-match #rx"\b[^<t> | ^<T> | ^<\n>]{<6>}\b" "grumpy\nstumpy\nfoobar" )
)
我是非常新的球拍,并希望一些输入,有用的链接,和任何其他帮助。
2条答案
按热度按时间kuhbmx9i1#
我根本不会使用正则表达式,而是使用
for/list
,结合string-length
和string-countains?
来解决这个问题。使用
call-with-input-file*
需要一个过程,在本例中,将f
绑定到一个打开的文件。这样,当我们使用完它时,我们不需要自己关闭文件。最后,
string-contains?
是最近才添加到Racket的。如果你需要支持Racket的旧版本,你可以使用regexp-match
只搜索“T”,这要容易得多。eqqqjvef2#
Racket正则表达式可以将输入端口作为匹配正则表达式的值之一。这意味着您可以在文件中查找匹配项,而不必首先从文件中读取;匹配的代码将为您完成这一部分。合并使用多行模式,以便
^
和$
在换行符之后和之前以及输入的开始和结束处进行匹配,您将获得一种简单的方法,使用regexp-match*
和RE单独匹配一行中的6个非t字符:使用输入端口时要记住的一件大事是,它返回的是 byte 字符串;您必须自己将它们转换为字符串。