我一直在制作一款受《口袋妖怪》启发的格斗游戏,其中 .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");
}
}
replaceFirst
的第一个参数是正则表达式。如果您不知道那是什么,那么您显然不想要它。使用另一种方法(.replace
,替换所有出现的情况。请注意,.replaceAll
的第一个参数也是正则表达式,因此您也不需要那个)。
如果替换
.replace
的所有方面都不符合您的喜好,请自己用.substring
和.indexOf
编写;这是一种单行方法。或者,通过转义来“修复它”: x.replaceFirst(Pattern.quote(arg1), replacement)
就是你想要的。如果你使用replaceFirst是因为它看起来更快——那绝对不是。只需使用.replace
。它取代了所有,并且不涉及正则表达式。
replaceFirst
和 replaceAll
是糟糕方法的可怕名称,这些方法最好不应该存在。但他们确实如此,java不会轻易删除东西。您真正能做的就是不要使用它们,并且知道 .replace
会替换所有内容,并且 replaceFirst
和 replaceAll
不应该使用,除非您真的非常知道自己在做什么,即使这样,也可能只是写用 Pattern
和 Matcher
代替。