如何修复“正则表达式”错误:索引 4 附近的未封闭组

问题描述 投票:0回答:1

我一直在制作一款受《口袋妖怪》启发的格斗游戏,其中 .txt 文件用于定义格式为 “名称”健康状况(“atkName”伤害、“atkName”伤害) 的团队,例如 “Guy”90(“Punch”10、“Kick”20、“大声喊叫”10),我的解码器脚本有两个问题,一个是我在索引 4 附近收到关于未封闭组的“正则表达式”错误第 43 行;另一个是,如果该文件不是由程序创建的,则该文件不会被解码。

这是团队课程:

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;

public class Team {

    private ArrayList<Character> team;
    private String name;

    public Team(String filename, String ext) throws IOException {
        this.team = new ArrayList<Character>();
        File account = new File("src\\" + filename + ext);

        int created = 0;
        if (account.createNewFile()) {
            created = 1;
        }

        FileInputStream fileIn = new FileInputStream(account);
        PrintWriter fileWr = new PrintWriter(account);

        Scanner accountReader = new Scanner(fileIn);

        if (created == 1) { // I'll later add a random fighter here
            fileWr.println("\"Cheesey old man\" 90 (\"Yeet fish\" 20, \"Cringe meme\" 30, \"Actually good meme\" 20, \"Amazing meme\" 40)");
        }
        fileWr.flush();
        fileWr.close();

        while (accountReader.hasNextLine()) {
            String charDat = accountReader.nextLine();
            String charName;
            int charHealth;
            ArrayList<Attack> atks;
            if (!charDat.isEmpty()) {
                charDat = charDat.substring(charDat.indexOf("\"") + 1);
                charName = charDat.substring(0, charDat.indexOf("\""));

                charDat = charDat.replaceFirst(charName + "\" ", "");

                charHealth = Integer.parseInt(charDat.substring(0, charDat.indexOf("(") - 1));
                // HERE VVVVVVVV
                charDat = charDat.replaceFirst(charHealth + "".concat(" ("), "");
                // HERE ^^^^^^^^
                atks = new ArrayList<Attack>();
                while (charDat.charAt(0) != ')') {
                    if (charDat.charAt(0) == ',') {
                        charDat =  charDat.replaceFirst(", ", "");
                    }
                    System.out.println(charDat);
                    charDat = charDat.substring(charDat.indexOf("\"") + 1);
                    System.out.println(charDat);
                    String atkName = charDat.substring(0, charDat.indexOf("\""));
                    System.out.println(atkName);

                    charDat = charDat.replaceFirst(atkName + "\" ", "");
                    System.out.println(charDat);
                    int atkDamage;
                    if (charDat.indexOf(",") != -1) {
                        atkDamage = Integer.parseInt(charDat.substring(0, charDat.indexOf(",")));
                        charDat = charDat.replaceFirst(atkDamage + ",", "");
                    } else {
                        atkDamage = Integer.parseInt(charDat.substring(0, charDat.indexOf(")")));
                        charDat = charDat.replaceFirst(atkDamage + ",", "");
                    }

                    atks.add(new Attack(atkName, atkDamage));

                    charDat = charDat.replaceFirst(charHealth + "", "");
                }


            this.team.add(new Character(charName, charHealth, atks));
            }
        }
        this.name = filename;
    }
}

这是角色和攻击类别:

import java.util.ArrayList;

public class Character {
    private String name;
    private  int maxHealth;
    private int health;
    private ArrayList<Attack> attacks;

    public Character(String name, int health, ArrayList<Attack> atks) {
        this.name = name;
        this.maxHealth = health;
        this.health = this.maxHealth;
        this.attacks = atks;
    }
}

public class Attack {
    private String name;
    private int damage;

    public Attack(String name, int damage) {
        this.name = name;
        this.damage = damage;
    }

    public String getName() {
        return this.name;
    }

    public int getDamage() {
        return this.damage;
    }
}

这是主要方法:

public class Main {
    public static void main(String args[]) throws IOException {
        Team team1 = new Team("Kreepy", ".txt");
    }
}
java regex file-io
1个回答
0
投票

replaceFirst
的第一个参数是正则表达式。如果您不知道那是什么,那么您显然不想要它。使用另一种方法(
.replace
,替换所有出现的情况。请注意,
.replaceAll
的第一个参数也是正则表达式,因此您也不需要那个)。

如果替换

.replace
的所有方面都不符合您的喜好,请自己用
.substring
.indexOf
编写;这是一种单行方法。或者,通过转义来“修复它”:
x.replaceFirst(Pattern.quote(arg1), replacement)
就是你想要的。如果你使用replaceFirst是因为它看起来更快——那绝对不是。只需使用
.replace
。它取代了所有,并且不涉及正则表达式。

replaceFirst
replaceAll
是糟糕方法的可怕名称,这些方法最好不应该存在。但他们确实如此,java不会轻易删除东西。您真正能做的就是不要使用它们,并且知道
.replace
会替换所有内容,并且
replaceFirst
replaceAll
不应该使用,除非您真的非常知道自己在做什么,即使这样,也可能只是写用
Pattern
Matcher
代替。

© www.soinside.com 2019 - 2024. All rights reserved.