gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:34:27 25 4
gpt4 key购买 nike

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

目前,我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com