3

例如,我需要匹配输入的文本文件字符串中的一行,并用一个字符包装捕获的行。

例如想象一个这样的文本文件:

test
foo
test
bar

我想使用 gsub 来输出:

XtestX
XfooX
XtestX
XbarX

我在匹配一条线时遇到了麻烦。我尝试使用以 ^ 开头并以 $ 结尾的正则表达式,但它似乎不起作用。有任何想法吗?

我有一个文本文件,其中包含以下内容:

test
foo
test
bag

文本文件正在作为命令行参数读入。

所以我得到了

string = IO.read(ARGV[0])
string = string.gsub(/^(test)$/,'X\1X')

puts string

它输出与文本文件中完全相同的内容。

4

5 回答 5

5

如果你想匹配每一行,那么

gsub(/^.*$/, 'X\&X')

成功了。如果您只想匹配某些行,请替换.*为您需要的任何内容。

更新:

用我的替换你gsub的:

string = IO.read(ARGV[0])
string = string.gsub(/^.*$/, 'X\&X')
puts string

我得到:

$ gsub.rb 测试文件
XtestX
XfooX
XtestX
XbarX

更新 2:

根据@CodeGnome,您可以尝试添加chomp

IO.readlines(ARGV[0]).each do |line|
  puts "X#{line.chomp}X"
end

这对我来说同样有效。我对正则表达式的理解是^$没有必要进行咀嚼,但也许我错了。

于 2013-04-13T19:29:43.970 回答
5

您可以像这样在一行中执行此操作:

IO.write(filepath, File.open(filepath) {|f| f.read.gsub(//<appId>\d+<\/appId>/, "<appId>42</appId>"/)})

IO.write默认情况下截断给定文件,因此如果您先阅读文本,执行正则表达式String.gsub并使用块模式返回结果字符串File.open,它将一举替换文件的内容。

我喜欢这样的阅读方式,但它当然也可以写成多行:

IO.write(filepath, File.open(filepath) do |f|
    f.read.gsub(//<appId>\d+<\/appId>/, "<appId>42</appId>"/)
  end
)
于 2013-09-20T10:00:02.150 回答
2

If your file is input.txt, I'd do as following

File.open("input.txt") do |file|
  file.lines.each do |line|
    puts line.gsub(/^(.*)$/, 'X\1X')
  end
end
  • (.*) allows to capture any characters and makes it a variable Regexp
  • \1 in the string replacement is that captured group

If you prefer to do it in one line on the whole content, you can do it as following

 File.read("input.txt").gsub(/^(.*)$/, 'X\1X')
于 2013-04-13T19:23:03.970 回答
1

string.gsub(/^(matchline)$/, 'X\1X') Uses a backreference (\1) to get the first capture group of the regex, and surround it with X

Example:

string = "test\nfoo\ntest\nbar"
string.gsub!(/^test$/, 'X\&X')
p string
=> "XtestX\nfoo\nXtestX\nbar"
于 2013-04-13T19:21:12.757 回答
0

Chomp 行结尾

您的行可能有换行符。您需要以一种或另一种方式处理此问题。例如,这对我来说很好:

$ ruby -ne 'puts "X#{$_.chomp}X"' /tmp/corpus
XtestX
XfooX
XtestX
XbarX
于 2013-04-13T19:54:07.813 回答