Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多个分隔符之间提取文本_Java_Regex_Delimiter_Text Extraction_Delimited Text - Fatal编程技术网

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

Java 在多个分隔符之间提取文本,java,regex,delimiter,text-extraction,delimited-text,Java,Regex,Delimiter,Text Extraction,Delimited Text,我需要从一个文本文件中提取一个特定的字符串,该文本文件的行中有多个分隔符,这些分隔符可能相似,也可能不同。例如,假设我有一个包含以下行的文本文件。让我们把分隔符中的每一个文本看作一个段。< /P> 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

我需要从一个文本文件中提取一个特定的字符串,该文本文件的行中有多个分隔符,这些分隔符可能相似,也可能不同。例如,假设我有一个包含以下行的文本文件。让我们把分隔符中的每一个文本看作一个段。< /P>
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);
    }
}
我的代码有两个问题。我不知道如何使用<代码>子字符串< /代码>来分隔相同的分隔符之间的文本,我不知道如何编写代码,以便能够识别所有以下特殊字符作为分隔符-<代码> { *,$,} /CUT>,从而考虑这些分隔符之间的任何文本作为段。< /P>
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$

这个问题的答案使用我想要避免的正则表达式。

只需拆分行并使用索引:

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方面的经验,因此请将此示例视为伪代码。

使用a,可以将分隔符作为字符串传递,然后在其上循环(请参见此),或者更好地使用String.split和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 $

这里有许多特殊字符,请注意,
replaceAll
接受一个正则表达式