Ruby 正则替换求助

faxiubite · 2013年11月06日 · 最后由 faxiubite 回复于 2013年11月11日 · 4159 次阅读

文件 内容如下:

1 Over the course of my long life, 18 Open it up. 19 What the hell? 20 Aah! 21 [Clatter] 22 Rebekah: Hello. 23 Mm. 24 Lovely to see such a handsome face 25 after a long journey. 26 Can I eat him, brother? 27 Elijah: I'd rather

you didn't.

希望替换后

1 Over the course of my long life, 18 Open it up. 19 What the hell? 20 Aah! 21 [Clatter] 22 Rebekah: Hello. 23 Mm. 24 Lovely to see such a handsome face 25 after a long journey. 26 Can I eat him, brother? 27

Elijah: I'd rather you didn't.

就是说如果有连续的两行字幕就把区中的换行符换成空格,有没有办法? long_string = IO.read("the.originals.1.txt") long_string.gsub!(/[A-Za-z][\s][A-Za-z]/,'') 怎么只替换这一部分?

前后不是数字的换行符咩

long_string.gsub!(/(?<!\d)\n(?!\d)/," ")

@faxiubite 用环视粗略写了一个(Ruby2.0)。

str.gsub(/(?<=[a-zA-Z,])\n(?=[a-z])/, " ")

*最后发现,还是楼上的简单。 *

#1 楼 @krazy 数字的那一行不换 你的把数字的那一行也换掉了

#2 楼 @blackanger 这个我试过不行 替换时提示错误 应该是正则表达式错误

楼上的不够健壮,多一些空格就误判了,而且没必要使用反向环视

r = %r{
  (\D) \s*             # 行末的最后一个非空白字符不能是数字
  (?= ^ \s* \D)      # 另一行第一个非空白字符不能是数字
}x

puts s.gsub(r, '\1 ')

str.gsub!(/(?<=[^1-9])\n(?=[^1-9])/,' ') 这个吧

#4 楼 @faxiubite 我这没问题啊。。。你是用 Ruby2.0 吗,报什么错。

一楼的也没问题啊,反正你给的例子是没问题,可能你真实的文本还有其他情况,你根据这个思路自己完善吧。

#5 楼 @__main__ 判断行末这招不错,good。我是把它当一个字符串处理了。

正则表达式我写的不多,一些技巧还是需要从实践中学习总结。

#8 楼 @blackanger C:\Users\zhaowang.TENCENT>ruby -v ruby 2.0.0p247 (2013-06-27) [x64-mingw32] 应该是用 windows 系统的问题吧 我再看看吧 谢谢了!

#5 楼 @__main__ 完美解决了!谢谢!

#5 楼 @__main__ hi 我现在又遇到编码问题了 filename ="log3.txt" r = %r{ (\D) \s* # 行末的最后一个非空白字符不能是数字 (?= ^ \s* \D) # 另一行第一个非空白字符不能是数字 }x s=IO.read(filename) f=open(filename+"changed.txt","w") s.gsub(r, '\1 ')

f.puts(s)

in `gsub!': invalid byte sequence in GBK (ArgumentError)

from test.rb:25:in `'

我试着将编码改为 UTF-8 还是不行,能帮忙看一下吗?

#12 楼 @faxiubite s.gsub(r, '\1 ').force_encoding("gb2312") s.gsub(r, '\1 ').force_encoding("utf-8") s.gsub(r, '\1 ').force_encoding("GBK") 都不行 “”“”“”“”“”“”“”“”“”“”“” in gsub': invalid byte sequence in GBK (ArgumentError) m test.rb:25:in

' “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”

不是正则的问题,是你读数据的时候没有正常编码

s = IO.read(filename, :open_args => ['r:utf-8'])

#14 楼 @__main__ 找到原因了 里面有中文 编码转换出问题了
正在寻找解决办法 谢谢

#14 楼 @__main__ #s=IO.read(filename, :open_args => ['r:UTF-8']) s=IO.read(filename) f=open(filename+"changed.txt","w") s.force_encoding("utf-8") f.puts(s.gsub(r, '\1 ')) 各种方法都试过了 还是不行 找不到原因

s=IO.read(filename).force_encoding("ISO-8859-1").encode("UTF-8", replace: nil) Ok 了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号