【发布时间】:2014-01-06 22:20:04
【问题描述】:
我一直在尝试创建一个程序来用空格替换制表符元素(假设制表符相当于 8 个空格,其中一个或多个由非空白字符(字母)占用。
我开始通过以下方式从扫描仪中提取文件中的文本:
try {
reader = new FileReader(file)
} catch (IOException io) {
println("File not found")
}
Scanner scanner = new Scanner(reader);
scanner.usedelimiter("//Z");
String text = Scanner.next();
然后我尝试解析以下面带有 ptrn1 的制表符结尾的文本片段,并使用 ptrn2 提取每个片段的最后一个单词的长度:
Pattern ptrn1 = Pattern.compile(".*\\t, Pattern.DOTALL);
Matcher matcher1 = ptrn1.matcher(text);
String nextPiece = matcher1.group();
println(matcher1.group()); /* gives me the first substring ending with tab*/
然而:
Pattern ptrn2 = Pattern.compile("\\s.*\\t"); /*supposed to capture the last word in the string*/
Matcher matcher2 = ptrn2.matcher(nextPiece);
String lastword = matcher2.group();
最后一行给了我一个错误,因为它显然无法与模式("\\s.\*\\t") 匹配任何内容。最后一个正则表达式有问题,它的意思是“任意数量的空格,后跟任意数量的字符,然后是制表符。但我无法找出它有什么问题。我有尝试了("\\s*.+\\t")、("\\s*.*\\t") 和("\s+.+\\t");仍然没有运气。
后来,根据以下建议,我简化了代码并将示例字符串包含在其中。如下:
import acm.program.*;
import acm.util.*;
import java.util.*;
import java.io.*;
import java.util.regex.*;
public class Untabify extends ConsoleProgram {
public void run(){
String s = "Be plain,\tgood son,\tand homely\tin thy drift.\tRiddling\tconfession\tfinds but riddling\tshrift. ";
Pattern ptrn1 =Pattern.compile(".*?\t", Pattern.DOTALL);
Pattern ptrn2 = Pattern.compile("[^\\s+]\t", Pattern.DOTALL);
String nextPiece;
Matcher matcher1 = ptrn1.matcher(s);
while (matcher1.find()){
nextPiece = matcher1.group();
println(nextPiece);
Matcher matcher2 = ptrn2.matcher(nextPiece);
println(matcher2.group());
}
}
}
程序不定时崩溃,首先在“println(matcher2.group())”;并在下一次运行“public void run()”时显示消息:“调试当前指令指针”(它的含义是什么?)。
【问题讨论】:
-
你想匹配什么文本?
-
字符串中制表符前的最后一个单词。