Java 如何编写正则表达式来提取制表符文本?
我一直在尝试创建一个程序,用空格替换制表符元素(假设一个制表符相当于8个空格,其中一个或多个空格由非空白字符(字母)表示) 我开始通过以下方式从扫描仪中提取文件中的文本:Java 如何编写正则表达式来提取制表符文本?,java,regex,Java,Regex,我一直在尝试创建一个程序,用空格替换制表符元素(假设一个制表符相当于8个空格,其中一个或多个空格由非空白字符(字母)表示) 我开始通过以下方式从扫描仪中提取文件中的文本: try { reader = new FileReader(file) } catch (IOException io) { println("File not found") } Scanner scanner = new Scanner(reader); scanner.usedelimiter("//Z"
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()”上运行,并显示消息:“调试当前指令指针”(它是什么意思?)。您不需要双重转义制表符(即
\\t
)\t
就可以了。\t
被java字符串解析器解释为制表符,该制表符被发送到正则表达式解析器,正则表达式解析器将其解释为制表符。有关详细信息,请参阅
此外,您应该使用Pattern.DOTALL
,而不是Pattern.DOTALL
您不需要双重转义制表符(即\\t
)\t
就可以了。\t
被java字符串解析器解释为制表符,该制表符被发送到正则表达式解析器,正则表达式解析器将其解释为制表符。有关详细信息,请参阅
此外,您应该使用Pattern.DOTALL
,而不是Pattern.DOTALL
您不需要双重转义制表符(即\\t
)\t
就可以了。\t
被java字符串解析器解释为制表符,该制表符被发送到正则表达式解析器,正则表达式解析器将其解释为制表符。有关详细信息,请参阅
此外,您应该使用Pattern.DOTALL
,而不是Pattern.DOTALL
您不需要双重转义制表符(即\\t
)\t
就可以了。\t
被java字符串解析器解释为制表符,该制表符被发送到正则表达式解析器,正则表达式解析器将其解释为制表符。有关详细信息,请参阅
此外,您应该使用Pattern.DOTALL
,而不是Pattern.DOTALL
模式“\\s.*\\t”
必须匹配一个空格字符(\s
),后跟0个或多个字符(*
),后跟一个制表符(\t
)。如果要捕获最后一个单词和尾随选项卡,应使用单词边界转义\b
Pattern.compile("\\b.*\\b\t");
如果您不想匹配任何字符,可以替换上面的
,使用\w
或任何您对单词字符的定义
下面是用于匹配选项卡前任何单词的代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegEx {
public static void main(String args[]) {
String text = "ab cd\t ef gh\t ij";
Pattern pattern = Pattern.compile("\\b(\\w+)\\b\t", Pattern.DOTALL);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
}
}
以上将输出
cd
gh
有关更多信息,请参阅,特别是和的部分
您可以获得更多详细信息,并在上试用此正则表达式。模式“\\s.*\\t”
必须匹配一个空格字符(\s
),后跟0个或多个字符(*
),后跟一个选项卡(\t
)。如果要捕获最后一个单词和尾随选项卡,应使用单词边界转义\b
Pattern.compile("\\b.*\\b\t");
如果您不想匹配任何字符,可以替换上面的
,使用\w
或任何您对单词字符的定义
下面是用于匹配选项卡前任何单词的代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegEx {
public static void main(String args[]) {
String text = "ab cd\t ef gh\t ij";
Pattern pattern = Pattern.compile("\\b(\\w+)\\b\t", Pattern.DOTALL);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
}
}
以上将输出
cd
gh
有关更多信息,请参阅,特别是和的部分
您可以获得更多详细信息,并在上试用此正则表达式。模式“\\s.*\\t”
必须匹配一个空格字符(\s
),后跟0个或多个字符(*
),后跟一个选项卡(\t
)。如果要捕获最后一个单词和尾随选项卡,应使用单词边界转义\b
Pattern.compile("\\b.*\\b\t");
如果您不想匹配任何字符,可以替换上面的
,使用\w
或任何您对单词字符的定义
下面是用于匹配选项卡前任何单词的代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegEx {
public static void main(String args[]) {
String text = "ab cd\t ef gh\t ij";
Pattern pattern = Pattern.compile("\\b(\\w+)\\b\t", Pattern.DOTALL);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
}
}
以上将输出
cd
gh
有关更多信息,请参阅,特别是和的部分
您可以获得更多详细信息,并在上试用此正则表达式。模式“\\s.*\\t”
必须匹配一个空格字符(\s
),后跟0个或多个字符(*
),后跟一个选项卡(\t
)。如果要捕获最后一个单词和尾随选项卡,应使用单词边界转义\b
Pattern.compile("\\b.*\\b\t");
如果您不想匹配任何字符,可以替换上面的
,使用\w
或任何您对单词字符的定义
下面是用于匹配选项卡前任何单词的代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegEx {
public static void main(String args[]) {
String text = "ab cd\t ef gh\t ij";
Pattern pattern = Pattern.compile("\\b(\\w+)\\b\t", Pattern.DOTALL);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
}
}
以上将输出
cd
gh
有关更多信息,请参阅,特别是和的部分
您可以获得更多详细信息,并在上尝试使用此正则表达式。查看示例字符串会很有用。如果您只想在选项卡前输入最后一个单词,