我需要从文本文件中提取一个特定的字符串,该文本文件具有多个分隔符,这些分隔符可能相似也可能不同。例如,假设我有一个包含以下行的文本文件。让我们将分隔符之间的每个文本视为一个段。
ABC#12#3#LINE1####1234678985$
DEF#XY#Z:1234:1234561230$
ABC#12#3#LINE TWO####1234678985$
DEF#XY#Z:1234:4564561230$
ABC#12#3#3RD LINE####1234678985$
DEF#XY#Z*1234:7894561230$
我需要编写一段代码,根据两个输入,在文本文件的所有行中提取ABC#12#3#
之后的文本。
1)要查找的段(例如,ABC
)
2)我需要从中提取文本的片段的位置。(例如,4
)
因此,输入ABC
和第4段将得到结果LINE1
,输入DEF
和第5段将得到结果1234678985
。这是我目前得到的关于第一个输入的结果。
scanner = new Scanner(file);
while (scanner.hasNextLine()) {
line = scanner.nextLine();
if (line.contains(find)){ // find is the 1st input - (e.g., ABC)
System.out.println("Line to be replaced - "+ line);
int ind1 = line.indexOf(findlastchar+"*")+1;
int ind2 = line.indexOf("*");
System.out.println("Ind1 is "+ ind1+ " and Ind2 is " + ind2);
System.out.println("findlastchar is "+findlastchar+"#");
remove = line.substring(line.indexOf(findlastchar)+1, line.indexOf("#"));
System.out.println("String to be replaced " + remove);
content = content.replaceAll(remove, replace);
}
}
我的代码有两个问题。我不知道如何使用substring
在相同的分隔符之间分隔文本,我不确定如何编写代码,以便能够识别所有以下特殊字符作为分隔符- {#, $, :}
,从而将任何这些分隔符之间的任何文本视为段。
这个问题的答案使用了我想避免的正则表达式
直接分隔行并使用index:
public String GetItemFromLine(String s, String delimiter, String prefix, int index) {
String[] items = s.split(delimiter);
return items[0] == prefix ? items[index] : null;
}
PS我没有Java的经验,所以请把这个例子当作伪代码。
可以使用StringTokenizer,其中可以将分隔符作为String传递,然后循环它(参见本例),或者更好地使用String。使用regexp分割:
String[] words = line.split("#|$|:");
这可能不是最有效的方法,但您可以使用regex来实现,例如:
(ABC[#:*$]+(?:w+[#:*$]+){2}|DEF[#:*$]+(?:w+[#:*$]+){3})([^#:*$]+)(.+)
演示其中{2}
和{3}
(给定模式的重复次数)决定字符串的哪一部分应该被替换。在这种情况下,您只更改分隔符之间的片段。Java示例:
public class Test{
public static void main(String[] args) {
String[] lines = {"ABC#12#3#LINE1####1234678985$",
"DEF#XY#Z:1234:1234561230$",
"ABC#12#3#LINE TWO####1234678985$",
"DEF#XY#Z:1234:4564561230$",
"ABC#12#3#3RD LINE####1234678985$",
"DEF#XY#Z*1234:7894561230$"};
for (String line : lines) {
String result = line.replaceAll("(ABC[#:*$]+(?:\w+[#:*$]+){2}|DEF[#:*$]+(?:\w+[#:*$]+){3})([^#:*$]+)(.+)","$1" + " replacement " + "$3");
System.out.println(result);
}
}
}
与输出:ABC#12#3# replacement ####1234678985$
DEF#XY#Z:1234: replacement $
ABC#12#3# replacement ####1234678985$
DEF#XY#Z:1234: replacement $
ABC#12#3# replacement ####1234678985$
DEF#XY#Z*1234: replacement $