julia到regex匹配文件中的行,如grep

julia到regex匹配文件中的行,如grep,julia,Julia,我希望看到julia的代码片段,它将读取文件并返回与正则表达式匹配的行(字符串类型) 我欢迎多种技术,但输出应等同于以下内容: $> grep -E ^AB[AJ].*TO' 'webster-unabridged-dictionary-1913.txt' ABACTOR ABATOR ABATTOIR ABJURATORY 我在这里使用的是GNU grep 3.1,文件中每个条目的第一行都是单独的all caps word。我喜欢的解决方案使用了一个简单的循环,非常容易理解 juli

我希望看到julia的代码片段,它将读取文件并返回与正则表达式匹配的行(字符串类型)

我欢迎多种技术,但输出应等同于以下内容:

$> grep -E ^AB[AJ].*TO' 'webster-unabridged-dictionary-1913.txt'

ABACTOR
ABATOR
ABATTOIR
ABJURATORY

我在这里使用的是GNU grep 3.1,文件中每个条目的第一行都是单独的all caps word。

我喜欢的解决方案使用了一个简单的循环,非常容易理解

julia> open("webster-unabridged-dictionary-1913.txt") do f
           for i in eachline(f)
               if ismatch(r"^AB[AJ].*TO", i) println(i) end
           end
       end

ABACTOR
ABATOR
ABATTOIR
ABJURATORY
笔记
  • 以制表符分隔的行保留了制表符(没有'\t'的文字输出)
  • 在本例中,我的源文件在定义上方的一行中包含所有大写的词典单词;返回完整的行
  • 文件I/O操作包装在a中,对于多行函数,它比lamba
    x->f(x)
    语法更方便地表示匿名函数。这在file
    open()
    命令中表现得尤为明显,该命令在使用函数作为参数调用时使用
    try finally close
    操作定义
    • 正则表达式对象的形式为
      r”“
    • 正则表达式本身就是一个字符串
    • 基于perl
    • 匹配成为正则表达式匹配对象
范例

julia> reg = r"^AB[AJ].*TO";
julia> typeof(reg)
Regex

julia> test = match(reg, "ABJURATORY")
RegexMatch("ABJURATO")

julia> typeof(test)
RegexMatch

您还可以使用
filter
功能在一行中完成此操作

filter(line -> ismatch(r"^AB[AJ].*TO",line),readlines(open("webster-unabridged-dictionary-1913.txt")))
filter
将返回布尔值的函数应用于数组,并仅返回数组中
true
的元素。本例中的函数是一个匿名函数
line->ismatch(r“^AB[AJ].*TO”,line)”
,其基本意思是调用被筛选数组的每个元素(本例中为每一行)
line


我认为这可能不是非常大的文件的最佳解决方案,因为整个文件需要在过滤之前加载到内存中,但对于本例,它似乎与使用
eachline
的for循环一样快。另一个区别是,此解决方案将结果作为数组返回,而不是打印每个结果,这取决于确定你想对匹配做什么可能是好的,也可能是坏的。

Julia使用命令行命令的方式就是把
放在前面,这样Julia的REPL

;grep -E ^AB[AJ].*TO' 'webster-unabridged-dictionary-1913.txt'

感谢您讨论
readlines()
在筛选之前使用整个文件并加载数组。这不需要
close()吗
operation?返回数组可能很有用,在这种情况下,我想复制grep的行为;我从这篇比较编程语言的有用博客文章中得到了这个想法,谢谢!如果你想像grep一样打印生成的数组,你可以执行
filter(line->ismatch(r“^AB[AJ].*to”,line),readlines(open(“webster-unabridged-dictionary-1913.txt”)。|>println;
。我认为它不需要
close()
-由于该流从未命名,我不确定您如何告诉
close
要关闭什么。这并不能回答问题。一般来说,这是一个有用的提示,但我已经知道如何用“grep”来解决这个问题。@Merlin对于将来遇到这种冷遇的人来说是一个很好的观点
ismatch()
在julia>1.0中不推荐使用。相反,应使用
occursin()