猿问

使用多个正则表达式:按出现的顺序一次打印一个匹配项

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


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


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


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


MMTTMM
浏览 147回答 1
1回答

撒科打诨

将它们组合成一个大的正则表达式,如下所示: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: packageIdentifier: testKeyword: importIdentifier: javaIdentifier: nioIdentifier: fileIdentifier: FilesKeyword: importIdentifier: javaIdentifier: nioIdentifier: fileIdentifier: PathsKeyword: importIdentifier: javaIdentifier: utilIdentifier: regexIdentifier: MatcherKeyword: importIdentifier: javaIdentifier: utilIdentifier: regexIdentifier: PatternKeyword: publicKeyword: classIdentifier: TestKeyword: publicKeyword: staticKeyword: voidIdentifier: mainIdentifier: StringIdentifier: argsKeyword: throwsIdentifier: ExceptionIdentifier: StringIdentifier: inputIdentifier: FilesIdentifier: readStringIdentifier: PathsIdentifier: getIdentifier: srcIdentifier: mainIdentifier: javaIdentifier: testIdentifier: TestIdentifier: javaIdentifier: StringIdentifier: keywordIdentifier: bKeyword: elseKeyword: ifKeyword: intKeyword: returnKeyword: voidKeyword: whileKeyword: forKeyword: packageKeyword: importKeyword: publicKeyword: protectedKeyword: privateKeyword: staticKeyword: classKeyword: throwsIdentifier: bIdentifier: StringIdentifier: identifierIdentifier: bIdentifier: aIdentifier: zAIdentifier: ZIdentifier: aIdentifier: zAIdentifier: Z0Number: -9Identifier: bIdentifier: StringIdentifier: numberIdentifier: bIdentifier: dIdentifier: bIdentifier: StringIdentifier: regexIdentifier: keywordIdentifier: identifierIdentifier: numberIdentifier: PatternIdentifier: patternIdentifier: PatternIdentifier: compileIdentifier: regexKeyword: forIdentifier: MatcherIdentifier: mIdentifier: patternIdentifier: matcherIdentifier: inputIdentifier: mIdentifier: findKeyword: ifIdentifier: mIdentifier: startNumber: 1Number: -1Identifier: SystemIdentifier: outIdentifier: printlnIdentifier: KeywordIdentifier: mIdentifier: groupKeyword: elseKeyword: ifIdentifier: mIdentifier: startNumber: 2Number: -1Identifier: SystemIdentifier: outIdentifier: printlnIdentifier: IdentifierIdentifier: mIdentifier: groupKeyword: elseIdentifier: SystemIdentifier: outIdentifier: printlnIdentifier: NumberIdentifier: mIdentifier: group
随时随地看视频慕课网APP

相关分类

Java
我要回答