在文件中查找字符串或字符串数组在 Java 中将它们分开
Posted
技术标签:
【中文标题】在文件中查找字符串或字符串数组在 Java 中将它们分开【英文标题】:Find String or String Array in a File separate them in Java 【发布时间】:2020-01-11 01:14:58 【问题描述】:我有一个 txt 文件,其中包括:
Hello Word
myStrings = [str1, str2, str3]
Goodbye Word
我想读取文件以找到“myStrings”字符串,然后有一个循环来检查 myStrings 值 [str1, str2, str3] 中的一个是否与某个变量匹配。
目前我正在寻找这样的 myStrings:
Scanner scanner = new Scanner(fileName);
while (scanner.hasNextLine())
String fileline = scanner.nextLine();
String myStringsKey = "myStrings =";
if(fileline.startsWith(myStringsKey))
如何实现 str2 以检查已定义的 var?我想我应该使用“拆分”。
【问题讨论】:
【参考方案1】:您必须解析该行的内容:您应该首先撕掉括号,然后用逗号分割字符串并将每个项目添加到Set
,其中将包含不同的值。
然后,立即检查该集合是否包含您想要的值。
【讨论】:
【参考方案2】:您可以使用正则表达式并将其包含在 if 块中:
if (fileline.startsWith(myStringsKey))
// regex to extract text within brackets
Pattern p = Pattern.compile("(?<=\\[).+?(?=\\])");
Matcher m = p.matcher(fileline);
while (m.find())
System.out.println(m.group().split(",")[1]); // str2
【讨论】:
但我需要检查定义的 var 是否等于 str1 或 str2 我们是否有办法动态定义而不是 sayin [1]? 这会返回什么?它将与哪个字符串进行比较?假设这是一个字符串“myStrings = [[st[r1, str2, str3]”,我希望 str3 作为输出 我的意思是,例如我已经定义了 static var myStatic="str3" 并且我已经用你的方式在 [ - ] 这些字符之间返回了 str1、str2、str3。 myStatic 和所有其他 3 个字符串之间的比较不好。如果我像你一样给出 [1],我只会得到 str2,但我想根据定义的一个找到 str3 或 str1。 - 并且在我的项目中定义的 var 将是动态的,例如从用户那里获取。 你可以循环遍历数组而不是直接访问索引然后检查——这是你需要的吗? @Mak:分割线后,您可以遍历它并检查。顺便说一句,那是你的反对票吗?【参考方案3】:以一种非常简单的方式,
Scanner scanner = new Scanner(fileName);
while (scanner.hasNextLine())
String fileline = scanner.nextLine();
String myStringsKey = "myStrings =";
if(fileline.startsWith(myStringsKey))
String[] temp = fileline.replaceAll("myStrings =","").replaceAll("\\[", "").replaceAll("\\]", "").trim().split(",");
for (int i = 0; i < temp.length; i++)
if(temp[i].trim().equalsIgnoreCase("str2"))
System.out.println("Str2 matched");
【讨论】:
如果字符串包含括号,这将失败,因为它也会替换每个字符串中的括号。例如:["ab[b", "zx[ccc"]
有几种方法可以防止它们被替换,例如 fileline.replaceFirst("\[", "") 或不包括第一个和最后一个字符的子字符串,我只是向他展示了这样做的方法。跨度>
【参考方案4】:
为了解析你的字符串,你可以使用以下简单的方法:
public String[] parseMyStrings(String s)
int beginIndex = s.indexOf("[") + 1;
int endIndex = s.indexOf("]");
s = s.substring(beginIndex, endIndex);
// split and trim in one shot
return s.split(("\\s*,\\s*"));
然后,您的最终代码可能如下所示:
Scanner scanner = new Scanner(fileName);
while (scanner.hasNextLine())
String fileline = scanner.nextLine();
String myStringsKey = "myStrings =";
if(fileline.startsWith(myStringsKey))
String[] values = parseMyStrings(fileline);
System.out.println(Arrays.toString(values));
我认为如果您将解析逻辑放入单独的方法中,您的代码将更具可读性并且更易于扩展或修改。
【讨论】:
【参考方案5】:scanner = new Scanner(new File(fileName));
while (scanner.hasNextLine())
String fileline = scanner.nextLine();
if(fileline.contains("myStrings"))
String string = fileline.substring(fileline.indexOf("[") + 1, fileline.indexOf("]"));
String[] vars = string.split(",");
System.out.println(Arrays.toString(vars));
【讨论】:
以上是关于在文件中查找字符串或字符串数组在 Java 中将它们分开的主要内容,如果未能解决你的问题,请参考以下文章
如何对文本文件进行排序以在 O(MN) 时间复杂度中查找字谜,其中 M 是最大字符数,N 是单词数?