java - 使用多个正则表达式: Print One Match at a Time in Order They are Seen

标签 java regex

给定一个字符串,我想按照扫描的顺序匹配标记,而不是通过循环无序打印特定类型标记的所有匹配项。

目前,我在 for-each 循环中迭代字符串数组。我的正则表达式可以捕获所有必要的标记,但不是按照它们出现的顺序。

这是我所拥有的。 for-each 循环调用 findTokens 函数来查找所有该 token 类型。这是错误的,因为这样它会通过正则表达式匹配而不是它们出现的顺序来查找 token 。

for(String line: lines) {
...
findTokens(line, keyword);
findTokens(line, identifier);
findTokens(line, number);
}

这是我的 findTokens 函数。它接受一个字符串和一个正则表达式。它检查 Regex 参数是否等于 Regex 声明之一(未显示)。

public static void findTokens(String str, String regex) {
        String keyword = "(else)+|(if)+|(int)+|(return)+|(void)+|(while)+|(main)+";
        String identifier = "\\b(?!(else)|(if)|(int)|(return)|(void)|(while)|(main))\\b[a-zA-Z]+";
        String number = "[\\d]+";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);

        if (regex.equals(keyword) ) {
            while ( matcher.find() ) { System.out.println("Keyword: " + matcher.group()); }
        } else if ( regex.equals(identifier) ) {
            while ( matcher.find() ) { System.out.println("ID: " + matcher.group()); }
        } else if ( regex.equals(number) ) {
            while ( matcher.find() ) { System.out.println("NUM: " + matcher.group()); }
        }
    }

预期输出:

INPUT: int g 4 cd int u int v
keyword: int
ID: g
NUM: 4
ID: cd
keyword: int
ID: u
keyword: int
ID: v

实际输出:

INPUT: int g 4 cd int u int v
keyword: int
keyword: int
keyword: int
ID: g
ID: cd
ID: u
ID: v
NUM: 4

最佳答案

将它们组合成一个大的正则表达式,如下所示:

package test;

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) throws Exception {
        String input = Files.readString(Paths.get("src/main/java/test/Test.java"));

        String keyword = "\\b(?:else|if|int|return|void|while|for|package|import|public|protected|private|static|class|throws)\\b";
        String identifier = "\\b[a-zA-Z][a-zA-Z0-9]*\\b";
        String number = "-?\\b[\\d]+\\b";
        String regex = "(" + keyword + ")|(" + identifier + ")|(" + number + ")";
        Pattern pattern = Pattern.compile(regex);
        for (Matcher m = pattern.matcher(input); m.find(); ) {
            if (m.start(1) != -1)
                System.out.println("Keyword: " + m.group());
            else if (m.start(2) != -1)
                System.out.println("Identifier: " + m.group());
            else
                System.out.println("Number: " + m.group());
        }
    }
}

该代码使用自己的源代码作为测试,因此输出为:

Keyword: package
Identifier: test
Keyword: import
Identifier: java
Identifier: nio
Identifier: file
Identifier: Files
Keyword: import
Identifier: java
Identifier: nio
Identifier: file
Identifier: Paths
Keyword: import
Identifier: java
Identifier: util
Identifier: regex
Identifier: Matcher
Keyword: import
Identifier: java
Identifier: util
Identifier: regex
Identifier: Pattern
Keyword: public
Keyword: class
Identifier: Test
Keyword: public
Keyword: static
Keyword: void
Identifier: main
Identifier: String
Identifier: args
Keyword: throws
Identifier: Exception
Identifier: String
Identifier: input
Identifier: Files
Identifier: readString
Identifier: Paths
Identifier: get
Identifier: src
Identifier: main
Identifier: java
Identifier: test
Identifier: Test
Identifier: java
Identifier: String
Identifier: keyword
Identifier: b
Keyword: else
Keyword: if
Keyword: int
Keyword: return
Keyword: void
Keyword: while
Keyword: for
Keyword: package
Keyword: import
Keyword: public
Keyword: protected
Keyword: private
Keyword: static
Keyword: class
Keyword: throws
Identifier: b
Identifier: String
Identifier: identifier
Identifier: b
Identifier: a
Identifier: zA
Identifier: Z
Identifier: a
Identifier: zA
Identifier: Z0
Number: -9
Identifier: b
Identifier: String
Identifier: number
Identifier: b
Identifier: d
Identifier: b
Identifier: String
Identifier: regex
Identifier: keyword
Identifier: identifier
Identifier: number
Identifier: Pattern
Identifier: pattern
Identifier: Pattern
Identifier: compile
Identifier: regex
Keyword: for
Identifier: Matcher
Identifier: m
Identifier: pattern
Identifier: matcher
Identifier: input
Identifier: m
Identifier: find
Keyword: if
Identifier: m
Identifier: start
Number: 1
Number: -1
Identifier: System
Identifier: out
Identifier: println
Identifier: Keyword
Identifier: m
Identifier: group
Keyword: else
Keyword: if
Identifier: m
Identifier: start
Number: 2
Number: -1
Identifier: System
Identifier: out
Identifier: println
Identifier: Identifier
Identifier: m
Identifier: group
Keyword: else
Identifier: System
Identifier: out
Identifier: println
Identifier: Number
Identifier: m
Identifier: group

关于java - 使用多个正则表达式: Print One Match at a Time in Order They are Seen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57664226/

相关文章:

Java 正则表达式 : String Formatting

java - 我的程序在 Eclipse 中读取 .txt 文件,但当我导出为 .jar 时却无法读取?

java - 获取 DocumentListener 的间接源

Java zip.close() 挂起

ruby 正则表达式 split 困难,关闭但不完全

python - Selenium:是否可以在两个 xpath 选择之间获取文本?

php - 正则表达式查找最后一组括号之间的数字

regex - XCode的Find Navigator使用什么正则表达式引擎

java - AWS lambda + spring boot = 不连接组件

java - spring框架的yml配置文件