2008年8月24日星期日

windows 和 linux 系统换行符号研究

有个上海的朋友问了我一个正则匹配空行的问题,虽然当时解决了他的需求但感觉概念没有弄清楚,直到上周五跟同事们研究后才恍然大悟。好了废话少说开门见山直奔主题。

首先要弄清楚windows 和 linux的换行怎么表示,
1. window 系统中一个文件里的每一行都以 《\r\n》结束
2. linux 系统中一个文件里的每一行都以 《\n》结束

以前以为都是用《\n》结束每行,读了JDK LineNumberInputStream#read()的源码后才明白不是这么回事。好、让我们来解决一个实际问题。上海的朋友需求是这样的:读一个文本文件并要求把第一个空行之前的所有的字符串用正则表达式匹配出来。 因当时不是很清楚上面两个语法,所以虽然解决了但是《瞎猫碰死耗子》了 呵呵。
问题的关键是怎么用正则表示空行呢?

window下每行都以《\n\r》结束,所以空行用正则《\n\r》表示
linux 下每行都以《\n》结束,所以空行用正则《\n\n》表示

注意:windows 和 linux下的空行表示是不同的

下面是用JAVA写的一个例子(windows):



import java.io.File;
import java.io.FileInputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class NTest {

private StringBuilder content = new StringBuilder();

/**
* 空行正则里是\n\r
* 测试文件内容为
a
b

c
d

e
*/
private Pattern pattern = Pattern.compile("(.*?)\n\r", Pattern.DOTALL);

@Before
public void setUp() throws Exception {
FileInputStream fis= null;
try {
fis = new FileInputStream(new File("c:/test.txt"));
byte[] b = new byte[1024];
int len = -1;
while ((len = fis.read(b)) != -1) {
content.append(new String(b, 0, len));
}
} finally {
if(null != fis)
fis.close();
}
}

@After
public void tearDown() throws Exception {
content = null;
}

@Test
public void Ntest() {
Matcher matcher = pattern.matcher(content);
int g = matcher.groupCount();
System.out.println("groupCount="+g);
while(matcher.find()){
System.out.println("finded it");
for (int i = 0; i < g ;i++){
System.out.println(matcher.group(i));
}
break;
}
}

}
运行结果为:

groupCount=1
finded it
------
a
b

没有评论: