regex 在球拍中打开文件,并在所述文件上使用正则表达式打印比赛

wmtdaxz3  于 2022-12-14  发布在  其他
关注(0)|答案(2)|浏览(76)

我一直在尝试在一个文本文件中使用正则表达式,该文件中充满了由行尾字符\n分隔的随机单词。(以最简单和最直观的方式),并使用regex打印长度为6的文件中不包含某个字母的所有单词(在这个例子中是字母t)。下面你可以看到我是如何读取文件的,但是我不确定如何使用它的结果列表,因为缺少变量。另外,你可以看到下面我用regex做了一个测试,结果是'当我实际上希望返回单词grumpyfoobar(不包括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" )

     )

我是非常新的球拍,并希望一些输入,有用的链接,和任何其他帮助。

kuhbmx9i

kuhbmx9i1#

我根本不会使用正则表达式,而是使用for/list,结合string-lengthstring-countains?来解决这个问题。

(call-with-input-file* "words.txt"
  (lambda (f)
    (for/list ([i (in-lines f)]
               #:when (and (= (string-length i) 6)
                           (not (string-contains? i "t"))))
      i)))

使用call-with-input-file*需要一个过程,在本例中,将f绑定到一个打开的文件。这样,当我们使用完它时,我们不需要自己关闭文件。
最后,string-contains?是最近才添加到Racket的。如果你需要支持Racket的旧版本,你可以使用regexp-match只搜索“T”,这要容易得多。

eqqqjvef

eqqqjvef2#

Racket正则表达式可以将输入端口作为匹配正则表达式的值之一。这意味着您可以在文件中查找匹配项,而不必首先从文件中读取;匹配的代码将为您完成这一部分。合并使用多行模式,以便^$在换行符之后和之前以及输入的开始和结束处进行匹配,您将获得一种简单的方法,使用regexp-match*和RE单独匹配一行中的6个非t字符:

#lang racket/base

(require racket/port)

;;; Using a string port to demonstrate
(define input "grumpy\nstumpy\nfoobar")

(define (list-matches inp)
  (map bytes->string/utf-8 (regexp-match* #px"(?m:^[^t]{6}$)" inp)))

(println (call-with-input-string input list-matches)) ; '("grumpy" "foobar")

使用输入端口时要记住的一件大事是,它返回的是 byte 字符串;您必须自己将它们转换为字符串。

相关问题