亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用多個正則表達式:按出現的順序一次打印一個匹配項

使用多個正則表達式:按出現的順序一次打印一個匹配項

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 關注
  • 214 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號