Jac*_*don 0 regex grouping parsing
我写了一个rexeg字符串将一个日志解析为一组组,但是当存在日志的可选部分时,它将创建一个空组。我已经?在正则表达式中将节标记为可选,但它似乎仍会创建一个空组。
这是我尝试过的两个正则表达式;
([0-9]{2}:[0-9]{2}\.[0-9]{2}) - (DMG|KILL):[ ]+(.*?)\[(.*?)\] (?:damaged|killed) (.*?) \[(.*?)\](?: for (\d{0,9}) dmg)?
([0-9]{2}:[0-9]{2}\.[0-9]{2}) - (DMG|KILL):[ ]+(.*?)\[(.*?)\] (?:damaged|killed) (.*?) \[(.*?)\](?: for (\d{0,9})? dmg)?
Run Code Online (Sandbox Code Playgroud)
我的第二个正则表达式在末尾带有问号(\d{0,9}),因为我认为这有可能创建了空组,但事实并非如此。我正在按照以下内容解析字符串:
00:00.00 - DMG: Player [group] damaged Victim [group] for 130 dmg
00:00.00 - KILL: Player [group] killed Victim [group]
Run Code Online (Sandbox Code Playgroud)
解析最后一行(否for X damage)时,在最后创建一个空组。
我为可怕的正则表达式表示歉意。
已经显示,由于在评论部分使用@ Sniffer,我的正则表达式可以正常工作。在这里可以看出它可以按预期工作,但是当在我的应用程序中实现时,它就不能正常工作。
在我的应用程序中,matcher.group(7)“杀”行上的(最后一个组)(不包含“ dmg”的行)返回null,matcher.groupCount()返回7而不是6,这意味着它将在末尾找到一个空组。我的正则表达式如下;
private static final Pattern match = Pattern.compile("([0-9]{2}:[0-9]{2}\\.[0-9]{2}) - (DMG|KILL):[ \t]+(.*?)\\[(.*?)\\] (?:damaged|killed) (.*?) \\[(.*?)\\](?: for (\\d{0,9}) dmg)?");
Run Code Online (Sandbox Code Playgroud)
这是我用来匹配模式的代码;
Matcher matcher = DamageEvent.match.matcher(tLine);
if (matcher.matches())
{
int matches = matcher.groupCount();
if (matches < 6 || matches > 7)
{
System.err.println("Invalid line: " + tLine);
return null;
}
String time = matcher.group(1);
String type = matcher.group(2);
String attackerName = matcher.group(3);
String attackerGroupString = matcher.group(4);
String victimName = matcher.group(5);
String victimGroupString = matcher.group(6);
String damage = "0";
System.out.println(matches);
if (matches == 7) // This results as 'true'
{
damage = matcher.group(7); // Damage is set to null :(
}
}
Run Code Online (Sandbox Code Playgroud)
如果匹配成功,但是指定的组与输入序列的任何部分都不匹配,则返回null。
所以下面的例子:
Matcher m1 = Pattern.compile("(t1)(t2)?(t3)").matcher("t1t3");
if(m1.matches()) {
for(int g=1;g<=m1.groupCount();g++){
System.out.println("Group "+g+": "+m1.group(g));
}
}
System.out.println("--------------");
Matcher m2 = Pattern.compile("(t1)()(t3)").matcher("t1t3");
if(m2.matches()) {
for(int g=1;g<=m2.groupCount();g++){
System.out.println("Group "+g+": "+m2.group(g));
}
}
Run Code Online (Sandbox Code Playgroud)
将输出:
Group 1: t1
Group 2: null
Group 3: t3
--------------
Group 1: t1
Group 2:
Group 3: t3
Run Code Online (Sandbox Code Playgroud)