我正在try 构建一个复杂的Java 17正则表达式,但在某些方面失败了.
我希望匹配的正则表达式/子字符串称为"metric set".一个指标集由6个segments组成,这6个部分中的每一个都可以是不同的"token type"中的任何一个.
第一个令牌类型为"distance token",由1个或多个数字[0-9]后跟双引号组成.距离标记的示例为:12"
、6"
、73"
等.
第二种令牌类型是"numeric token"并且简单地由数字字符[0-9]
组成.重要的是要注意,数字令牌也可以是有符号的(这意味着,有些可以是负数),并且在它们之前包含减号("-").数字令牌的例子有:9
、18
、293
、-4
、-15
等.
第三种令牌类型是"random token".此令牌可以以1+个可选数字字符[0-9]
开头,也可以省略.则令牌将有一个大写的"D",后跟一个3或6.随机令牌的例子有:D3
、D6
、12D3
、4D6
等.
第四个令牌类型可以是"不适用"令牌,在这种情况下,值必须正好是N/A
.
第五种令牌类型称为"greater-than token",由1+数字[0-9]后跟加号("+")组成.大于标记的示例有:3+
、12+
、1+
、0+
、19+
等.
第六种令牌类型称为"ignorables token",由单词Melee
或Ranged
组成.
这些是标记类型,同样,正则表达式的6个不同段允许不同的段是不同的标记类型,如下所述.
第一段可以是以下任何令牌类型:距离令牌、随机令牌、可忽略令牌或不适用的令牌.
第二段可以是除距离令牌或可忽略令牌之外的任何令牌类型.
第三段可以是以下令牌类型中的任何一种:大于令牌、随机令牌或不适用令牌.
第4段可以是除距离令牌或可忽略令牌之外的任何令牌类型.
第五段可以是除距离令牌或可忽略令牌之外的任何令牌类型.
第6段可以是除距离令牌或可忽略令牌之外的任何令牌类型.
请向我展示Java 17代码,该代码实例化满足这些条件的字符串正则表达式,然后将输入字符串与该正则表达式进行匹配,并在匹配时从输入字符串中提取匹配的度量集(所有6个段).
以下是符合所有这些规则的匹配字符串的几个示例:
Flamer [IGNORES COVER, TORRENT] 12" D6 N/A 4 0 1
Grav-gun [ANTI-VEHICLE 2+] 18" 2 3+ 5 -1 2
Grav-pistol [ANTI-VEHICLE 2+, PISTOL] 18" 1 3+ 4 -1 2
Hand flamer [IGNORES COVER, PISTOL, TORRENT] 12" D6 N/A 3 0 1
以下是我的最新代码,代表了我到目前为止所做的最好try :
import java.util.regex.*;
public class MetricSetRegexMatcher {
public static void main(String[] args) {
String regex = "(\\d+\"|D[36]|Melee|Ranged|N/A)(?!.*\\d+\")(\\d+|D[36]|Melee|Ranged|N/A)(\\d+\\+|D[36]|N/A)(\\d+|D[36]|Melee|Ranged|N/A)(\\d+|D[36]|Melee|Ranged|N/A)(\\d+|D[36]|Melee|Ranged|N/A)";
String input = "Hello there: 18\" 2 3+ 9 -4 D6";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) {
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Segment " + i + ": " + matcher.group(i));
}
} else {
System.out.println("No match!");
}
}
}
当运行此命令时,我得到输出"No Match!"我想知道我的正则表达式在哪里不符合我的标准.理想情况下,我能够匹配并从字符串中提取18" 2 3+ 9 -4 D6
,用于后续处理.