2011-03-24 109 views
0

我要搜索并替换一个 文本文件中的一些数字代替,并且由空格分隔和 合并在一起,搜索与扫描

asdf asdf 1 2 
3 asdf asdf asdf 
2 3 asdf 

asdf asdf 123 
asdf asdf asdf 
23 asdf 

我尝试了以下,但它不起作用,我不知道如何最好地在文件中进行替换:

text = File.read("testfile.txt") 
p text.scan(/([\d+\s+\d+]+)/) 
+2

你只提到空格作为分隔符,但在你的榜样,你是断行后串接“3”到之前的'2'。我知道你实际上想要包含白色字符(空格/制表符/换行符)作为分隔符,但是在转换后,为什么在第二行开头的'3'和之前的'asdf'之间有换行符在第一行的结尾? – sawa 2011-03-24 03:22:44

+1

对,这里真的有两个问题。 (1)是否真的有意将由换行符分隔的数字字符串合并? (2)如果是这样,在那种情况下,我们应该用换行符做些什么?有人会认为*“删除”*,但在你的例子中,你*移动了它。 – DigitalRoss 2011-03-24 04:15:56

回答

1
FN = 'thefile' 
result = File.read(FN).gsub /(\d)\s+(?=\d)/, '\1' 
open(FN, 'w') { |io| io.write(result) } 
+0

@Flethuseo,我不确定你是否真的想像你的例子那样将新行嵌入到数字字符串中。我的回答和sawa都只是删除嵌入的换行符。如果你真的需要保留每一个,请让我们知道...... – DigitalRoss 2011-03-24 03:39:26

+0

使用'\ s *'而不是'\ s +'将会做一个简单的替换。还是对的,但额外的更换。 – sawa 2011-03-24 03:43:25

+0

好的,现在修复... – DigitalRoss 2011-03-24 04:12:52

1

其实,你不需要\d+\d就足够了。

gsub(/(\d)\s+(?=\d)/, '\1') 

如果你已经安装了oniguruma或正在使用ruby1.9,

gsub(/(?<=\d)\s+(?=\d)/, '') 
+0

请检查您的正则表达式,看看它是否产生正确的结果,因为我不能,至少在你的第一个例子。这取决于我们使用\ d +还是\ d。通过在第二个例子中使用\ d,你可以在图片中引入'?<'和'?=',这也是不必要的。 – kurumi 2011-03-24 03:20:46

+0

@kurumi我测试了它们。两者都没有问题。为什么使用与'?<'和'?='相关的'\ d'?使用lookbehead和lookahead会更好,因为您不必在替换字符串中引用它们。一般来说,数学短于更好。 – sawa 2011-03-24 03:32:38

+0

你的第一个例子不适用于'1 2 3 4 5'(例如)。 – kurumi 2011-03-24 03:48:27