在“”之后和之前读取字符串“(”在java中使用split

时间:2014-02-10 17:04:42

标签: java file parsing split

我有行的txt文件: 第1行 - 20-01-01 Abs Def est(xabcd) 第2行 - 290-01-01 Abs Def est ghj gfhj(xabcd fgjh fgjh) 第3行 - 20-1-1 Absfghfgjhgj(xabcd ghj 5676gyj)

我想保留3个不同的String数组:

  1. [0] 20-01-01 [1] 290-01-01 [2] 20-1-1
  2. [0] Abs Def est [1] Abs Def est ghj gfhj [2] Absfghfgjhgj
  3. [0] xabcd [1] xabcd fgjh fgjh [2] xabcd ghj 5676gyj
  4. 使用String []数组1 = myLine.split(“”)我只有20-01-01片段,但我也想保留其他2个字符串

    编辑:我想这样做使用常规表达式(文本文件很大)

    这是我的一段代码: 请帮助,我搜索,但没有找到任何东西 THX。

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.Reader;
    
    import java.util.Comparator;
    import java.util.Date;
    import java.util.Set;
    import java.util.TreeSet;
    
    
    public class Holiday implements Comparable<Date>{
    
        Date date;
        String name;
        public Holiday(Date date, String name){
            this.date=date;
            this.name=name;
        }
    
    
        public static void main(String[] args) throws IOException {
    
    
            FileInputStream fis = new FileInputStream(new File("c:/holidays.txt"));
            InputStreamReader isr = new InputStreamReader(fis, "windows-1251");
            BufferedReader br = new BufferedReader(isr);
    
    
    
            TreeSet<Holiday> tr=new  TreeSet<>();
    
            System.out.println(br.readLine());
            String myLine = null;
    
    
    
            while ( (myLine = br.readLine()) != null)
            {  
                String[] array1 = myLine.split(" "); //OR use this
                //String array1 = myLine.split(" ")[0];//befor " " read 1-st string
    
                //String array2 = myLine.split("")[1];
    
                //Holiday h=new Holiday(array1, name)
                //String array1 = myLine.split(" ");
                // check to make sure you have valid data
              //  String[] array2 = array1[1].split(" ");
    
                System.out.println(array1[0]);
            }
    
        }
    
    
    
    
        @Override
        public int compareTo(Date o) {
            // TODO Auto-generated method stub
            return 0;
        }
    
    }
    

4 个答案:

答案 0 :(得分:2)

Pattern p = Pattern.compile("(.*?) (.*?) (\\(.*\\))");
Matcher m = p.matcher("20-01-01 Abs Def est (abcd)");
if (!m.matches()) throw new Exception("Invalid string");
String s1 = m.group(1); // 20-01-01
String s2 = m.group(2); // Abs Def est
String s3 = m.group(3); // (abcd)

答案 1 :(得分:0)

使用StringTokenizer,默认情况下使用“”作为分隔符。

答案 2 :(得分:0)

你似乎是基于空白分裂。字符串数组的每个元素都包含单独的空格分隔的子字符串,然后您可以通过字符串连接将它们拼凑回来。

例如,

array1[0]将是20-01-01

array1[1]将是Abs

array1[2]将是Def

等等。

另一种选择是Java正则表达式,但是如果输入文本文件具有一致的格式并且需要处理很多行,那么这可能只有用。它非常强大,但需要一些经验。

答案 3 :(得分:0)

通过正则表达式匹配所需的文本数据。 下面的正则表达式确保中间正好有3个单词,括号中有1个单词。

String txt = "20-01-01 Abs Def est hhh (abcd)";

Pattern p = Pattern.compile("(\\d\\d-\\d\\d-\\d\\d) (\\w+ \\w+ \\w+) ([(](\\w)+[)])");

Matcher matcher = p.matcher(txt);
if (matcher.find()) {
    String s1 = matcher.group(1);
    String s2 = matcher.group(2);
    String s3 = matcher.group(3);
    System.out.println(s1);
    System.out.println(s2);
    System.out.println(s3);
}

但是,如果您需要更多灵活性,可能需要使用Lence Java提供的代码。