匹配IO#read返回的行的开头的奇怪行为

时间:2013-03-08 04:57:58

标签: ruby regex

这是我今天早上遇到的情况。我有很多用CMD模式编写的JavaScript文件,如下所示:

define(function(require, exports) {
    // code goes here
})

我有一个简单的ruby脚本来操作这些文件,结果如下:

define(['module-a', 'module-b'], function(reuqire, exports) {
    // code
})

我这样做的方法是打开这些文件,阅读它们的内容,查看它们是否匹配/^define\(function/,然后替换它们:

code = File.open('foo.js').read
if code =~ /^define\(function/
  # do some work
end

奇怪的是,代码与正则表达式不匹配。第2行返回nil。这将有效:

code = "define(function(require, exports) {\n"
code =~ /^define\(function/ # ==> 0

如果使用nil读取代码,则只返回IO#read。然而,字符串的开头有效:

code = File.open('foo.js').read
code =~ /.define\(function/m # ==> 0

code[0] # ==> "" returns an empty string

^是否与所有行开头匹配?

2 个答案:

答案 0 :(得分:0)

在“define”之前检查\ n以外的空格?特别是\ r。 。

答案 1 :(得分:0)

奇怪的字符串原来是该文本文件的BOM。该项目的一些同事使用BOM保存了UTF-8中的文件,这是我们同意使用的编码。

以下是解决方案:Is there a way to remove the BOM from a UTF-8 encoded file?