Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何编写正则表达式来提取制表符文本?_Java_Regex - Fatal编程技术网

Java 如何编写正则表达式来提取制表符文本?

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"

我一直在尝试创建一个程序,用空格替换制表符元素(假设一个制表符相当于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()”上运行,并显示消息:“调试当前指令指针”(它是什么意思?)。

您不需要双重转义制表符(即
\\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
有关更多信息,请参阅,特别是和的部分


您可以获得更多详细信息,并在上尝试使用此正则表达式。

查看示例字符串会很有用。如果您只想在选项卡前输入最后一个单词,