Java 扫描器定界符用法

标签 java regex java.util.scanner delimiter

我想为按某种模式拆分的扫描器指定一个分隔符,但不会从 token 中删除该模式。我似乎无法完成这项工作,因为正则表达式识别的任何内容也会作为分隔符的一部分被吃掉。有什么建议吗?

我的具体问题,我有这样的文件:

text/numbers mix
numbers
numbers
text/numbers mix
numbers
numbers
numbers
.
.

我想从文本/数字混合+行中拆分出来,直到下一个文本/数字混合。我有正则表达式来识别它们,但如前所述,使用它作为分隔符会吃掉我想要的部分内容。

编辑:代码添加:

static final String labelRegex="\\s*[^01\\s*]\\w+\\s*";
static final Pattern labelPattern = Pattern.compile(labelRegex, Pattern.MULTILINE);

是我用来识别文本/数字位的模式(我知道我的数字行包含所有由空格分隔的 1/0)。

当我初始化扫描仪时:

stateScan = new Scanner(new BufferedReader(new FileReader(source)));
stateScan.useDelimiter(labelPattern);

吃掉标签,只留下行。我目前有一个工作实现,它在来自同一源的两个缓冲文件读取器上启动两个扫描器,一个按状态拆分,另一个按标签拆分。我真的很希望它只是一个抓取标签+状态。

最佳答案

您可以在正则表达式中使用正面展望。向前看(和向后看)不包括在比赛中,因此它们不会被扫描器“吃掉”。 这个正则表达式可能会做你想做的事:

(?=text/numbers)

分隔符将是子字符串 text/numbers 之前的空字符串。

这是一个小演示:

public class Main {
    public static void main(String[] args) {
        String text = "text/numbers mix\n"+
                "numbers\n"+
                "numbers\n"+
                "text/numbers mix\n"+
                "numbers\n"+
                "numbers\n"+
                "numbers";
        String regex = "(?=text/numbers)";
        Scanner scan = new Scanner(text).useDelimiter(regex);
        while(scan.hasNext()) {
            System.out.println("------------------------");
            System.out.println(">"+scan.next().trim()+"<");
        }
    }
}

产生:

------------------------
>text/numbers mix
numbers
numbers<
------------------------
>text/numbers mix
numbers
numbers
numbers<

关于Java 扫描器定界符用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1547797/

相关文章:

java - 在 Spring 中注入(inject) EJB

java - 获取集合中的单个元素

java - 包含 switch case 语句并插入到数据库的方法的单元测试

python - 在 MySQL 中搜索短语关键字

c posix 正则表达式验证输入 HH :MM:SS time string

regex - Perl:如何在对变量进行分组后插入数字?

java - 如何在 Java 中要求用户在循环中重新输入某个字符串时只打印一次文本

java - 如何根据输入类型执行某些命令

java - 使用 Scanner.nextInt() 与 Scanner.nextLine() 的异常处理

java - 将滚动条添加到 jframe 网格