为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMTTMM 2023-06-21 14:57:26
给定一个字符串,我想按照扫描的顺序匹配标记,而不是通过循环无序打印特定类型标记的所有匹配项。目前,我在 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 vkeyword: intID: gNUM: 4ID: cdkeyword: intID: ukeyword: intID: v实际输出:INPUT: int g 4 cd int u int vkeyword: intkeyword: intkeyword: intID: gID: cdID: uID: vNUM: 4
查看完整描述

1 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

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


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



查看完整回答
反对 回复 2023-06-21
  • 1 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信