在多个分隔符之间提取文本
问题描述:
我需要从具有多个分隔符的文本文件中提取特定的字符串,这些分隔符可能相似或不同。例如,让我说我有一个文本文件包含下面的行。让我们将分隔符之间的每个文本看作一个段。在多个分隔符之间提取文本
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
和第四区段的输入会给出一个结果 - LINE1
和DEF
和第五区段的输入会给出一个结果 - 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);
}
}
我有我的代码有2个问题。我不知道如何使用substring
在SAME分隔符之间分隔文本,我不知道如何编写代码,以便能够识别以下所有特殊字符作为分隔符: - {#, $, :}
,从而考虑ANY之间的任何文本这些分隔符作为细分。
回答this问题使用正则表达式,我想避免。
答
,只需拆分线和使用指标:
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,在那里你可以通过分隔符为字符串,然后遍历它(见本example)甚至更好的使用String.split用正则表达式:
String[] words = line.split("#|$|:");
答
它它可能不是最有效的方式,但你可以用正则表达式做到这一点,例如:
(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 $
你有很多特殊字符出现,请注意,'replaceAll'接受*正则表达式*。 – Maroun
[Java:use split()with multiple delimiters]可能重复](http://stackoverflow.com/questions/5993779/java-use-split-with-multiple-delimiters) – hotzst