【问题标题】:Ruby regex matching a line in an inputted text file string [duplicate]Ruby正则表达式匹配输入文本文件字符串中的一行[重复]
【发布时间】:2013-04-06 04:58:21
【问题描述】:

我需要匹配输入的文本文件字符串中的一行,然后用一个字符换行捕获的行。

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

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

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

我试过了

string = string.gsub(/^(.*)$/, 'X\1X')

这个输出:

Xtest
Xfoo
Xtest
Xbar

...为什么?

好的,所以我退格了文本文件的最后一行,现在我得到了这个......

Xtest
Xfoo
Xbar
XtestX

【问题讨论】:

  • 根据您的正则表达式,您只期望那些以 test 开头的行,但您想要的输出不同!
  • @UpasanaShukla 你是什么意思?我的示例代码试图用 Xs 包装测试,所以我的输出应该包含与 XtestX 相同的所有内容,但它没有。
  • 查看您想要的输出,因为无论是否以 test 开头,每一行都在进行替换。不是吗?
  • ruby 1.9.3p194 这并不愚蠢!
  • @Tommy 在这行之后:string = IO.read(ARGV[0]),你能用p 打印字符串并给我们输出(即p string)吗? (我知道它应该与文件相同,但我想确定)

标签: ruby regex gsub


【解决方案1】:
string = "test\r\nfoo\r\ntest\r\nbar"
string = string.gsub(/^test(?=\r?\n)/, 'X\&X').delete(?\r)
puts string

【讨论】:

  • 谢谢。这绝对是 \r 的问题。我摆脱了它们,现在它可以工作了。
【解决方案2】:

它在我手机上的 Ruboto IRB 中运行良好。您能否制作一个独立的单行示例并发布?不需要文件 IO。你用的是什么 ruby​​ 版本?

我怀疑你的程序有错别字。

【讨论】:

  • 我的程序绝对没有错字。如果我打印我输入的字符串,我会得到 "test\r\nfoo\r\nbar\r\ntest" 它与 \r 或其他内容不匹配吗?
  • puts "test\r\nfoo\r\nbar\r\ntest".gsub(/^(.*)$/, 'X\1X') 输出我展示的内容Xtest Xfoo Xbar XtestX
【解决方案3】:

问题是由于dos行尾(\r\n),所以为了摆脱这个,有一个flip命令(在MAC中,如果我是正确的)用于将dos行尾转换为mac行尾(\r)。搜索它并将 dos 行结尾转换为 mac 行结尾,然后再使用该文本文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多