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

3

我需要从一个文本文件中提取一个特定的字符串,这个文件有多个分隔符的行,这些分隔符可能相似也可能不同。例如,假设我有一个文本文件包含以下行。让我们把每个分隔符之间的文本视为一个段落。

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来分隔相同定界符之间的文本,并且我不确定如何编写代码以便能够将以下所有特殊字符识别为定界符- {#, $, :},并因此将这些定界符之间的任何文本视为一个段落。
回答问题的方法使用了正则表达式,但我想避免使用它。

你有很多特殊字符在那里,请注意 replaceAll 接受一个 正则表达式 - Maroun
可能是Java:使用多个分隔符拆分(split())的重复问题。 - hotzst
3个回答

0

可以使用StringTokenizer,其中可以将分隔符作为字符串传递,然后循环遍历它(请参见此示例),或者更好地使用带有正则表达式的String.split:

String[] words = line.split("#|$|:");

0

只需拆分行并使用索引:

public String GetItemFromLine(String s, String delimiter, String prefix, int index) {
   String[] items = s.split(delimiter);
   return items[0] == prefix ? items[index] : null;
}

顺便说一下,我没有Java的经验,所以请把这个例子当作伪代码。


0

这可能不是最有效的方法,但你可以使用正则表达式来实现,例如:

(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 $

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接