在多个分隔符之间提取文本

问题描述:

我需要从具有多个分隔符的文本文件中提取特定的字符串,这些分隔符可能相似或不同。例如,让我说我有一个文本文件包含下面的行。让我们将分隔符之间的每个文本看作一个段。在多个分隔符之间提取文本

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和第四区段的输入会给出一个结果 - LINE1DEF和第五区段的输入会给出一个结果 - 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问题使用正则表达式,我想避免。

+0

你有很多特殊字符出现,请注意,'replaceAll'接受*正则表达式*。 – Maroun

+0

[Java:use split()with multiple delimiters]可能重复](http://stackoverflow.com/questions/5993779/java-use-split-with-multiple-delimiters) – hotzst

,只需拆分线和使用指标:

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})([^#:*$]+)(.+) 

DEMO

凡与{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 $