Использование сопоставления с образцом для сортировки из файла, Java - PullRequest
0 голосов
/ 29 января 2019

Итак, я довел свою программу до точки, где она правильно разделяет строки текстового файла и может даже соответствовать шаблону для первой строки текста, но мне также нужно иметь возможность обнаруживать и разделять строки адресатекстового файла и сортировать их в зависимости от их направления или улицы / Бродвей, но я не могу даже получить начальный шаблон, который будет обнаружен для настройки адреса.Я использую регулярное выражение неправильно, и поэтому адресная часть не будет правильно определена?

КОД

package csi311;

// Import some standard Java libraries.
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.ArrayList;
/**
 * Hello world example.  Shows passing in command line arguments, in this case a filename. 
 * If the filename is given, read in the file and echo it to stdout.
 */
public class HelloCsi311 {

    /**
     * Class construtor.
     */
    public HelloCsi311() {
    }


    /**
     * @param filename the name of a file to read in 
     * @throws Exception on anything bad happening 
     */
    public void run(String filename) throws Exception {
        if (filename != null) {
            readFile(filename); 
        }
    }


    /**
     * @param filename the name of a file to read in 
     * @throws Exception on anything bad happening 
     */
    private void readFile(String filename) throws Exception {
        System.out.println("Dumping file " + filename); 
        // Open the file and connect it to a buffered reader.
        BufferedReader br = new BufferedReader(new FileReader(filename));  
        ArrayList<String> foundaddr = new ArrayList<String>();
        String line = null;  
        String pattern = "^\\d\\d\\d-[A-Za-z][A-Za-z][A-Za-z]-\\d\\d\\d\\d";
        String address[] = new String[4];
        address[0] = "\\d{1,3}\\s\\[A-Za-z]{1,20}";
        address[1] = "\\d{1,3}\\s\\[A-Za-z]{1,20}\\s\\d{1,3}\\[A-Za-z]{1,20}\\s\\[A-Za-z]{1,20}";
        address[2] = "\\d{1,3}\\s\\d{1,3}\\[A-Za-z]{1,20}\\s\\[A-Za-z]{1,20}";
        address[3] = "\\d\\d\\s\\[A-Za-z]{1,20}";
        Pattern r = Pattern.compile(pattern);
        // Get lines from the file one at a time until there are no more.
        while ((line = br.readLine()) != null) {
            if(line.trim().isEmpty()) {
                continue;
            }
            String sample = line.replaceAll("\\s+,", ",").replaceAll(",+\\s",",");
            String[] result = sample.split(",");
            String pkgId = result[0].trim().toUpperCase();
            String pkgAddr = result[1].trim();


            Float f = Float.valueOf(result[2]);
            for(String str : result){
                // Trying to match for different types
                for(String pat : address){
                    if(str.matches(pat)){
                        System.out.println(pat);
                    }
                }



                if(f < 50 && !pkgId.matches(pattern)) {
                    Matcher m = r.matcher(str);
                    if(m.find()) {
                        foundaddr.add(str);
                    }
                }
            }
        }

        if(foundaddr != null) {
            System.out.println(foundaddr.size());
        }   

        // Close the buffer and the underlying file.
        br.close();
    }



    /**
     * @param args filename
     */
    public static void main(String[] args) {
        // Make an instance of the class.
        HelloCsi311 theApp = new HelloCsi311();
        String filename = null; 
        // If a command line argument was given, use it as the filename.
        if (args.length > 0) {
            filename = args[0]; 
        }
        try { 
            // Run the run(), passing in the filename, null if not specified.
            theApp.run(filename);
        }
        catch (Exception e) {
            // If anything bad happens, report it.
            System.out.println("Something bad happened!");
            e.printStackTrace();
        }    
    }
}

Текстовый файл

123-ABC-4567, 15 W. 15th St., 50.1
456-BGT-9876,22 Broadway,24
QAZ-456-QWER, 100 East 20th Street,50
Q2Z-457-QWER, 200 East 20th Street, 49
6785-FGH-9845 ,45 5th Ave, 12.2,
678-FGH-9846 ,45 5th Ave, 12.2

123-ABC-9999, 46 Foo Bar, 220.0
347-poy-3465, 101 B'way,24

Ниже приведены строки кода, которые должны быть в состоянииобрабатывать адресные строки, но по какой-то причине он не соответствует шаблону и выходным данным, которые правильно разделяют адресные строки и могут быть видны в операторе print над циклом for, работающим с адресами, но по какой-то причине адресные строки даже не обнаруживаются каксовпадает, и я запутался в том, почему это так.

Строка кода связана с

  for(String str : result){
      //System.out.println(str);
      // Trying to match for different types
      for(String pat : address){
          if(str.matches(pat)){
              System.out.println(pat);
          }
      }

Желаемый вывод - Редактировать как запрашиваемый -

22 Broadway
45 5th Ave
101 B'way

1 Ответ

0 голосов
/ 29 января 2019

Я полагаю, что проблема в вашем Regex.\\d\\d\\s\\[A-Za-z]{1,20} например, после того, как все экранирование становится \d\d\s\[A-Za-z]{1,20}.Это разбивается следующим образом:

  • \d: сопоставление с любой цифрой
  • \d: сопоставление с любой цифрой
  • \s: сопоставление с любым символом пробела
  • \[: соответствует [ символу
  • A-Za-z: соответствует буквенному тексту A-Za-z
  • ]: соответствует буквенному символу ]
    • {1,20}: совпадать с предыдущим символом (]) 1-20 раз.

Регулярное выражение, которое вы, вероятно, хотите, - \d\d\s[A-Za-z]{1,20}, которое, какэкранированная строка - \\d\\d\\s[A-Za-z]{1,20}.Обратите внимание, что перед [ не существует \.

Еще одна вещь, о которой следует помнить, это то, что регулярные выражения могут совпадать в любом месте строки.Например, регулярное выражение a будет соответствовать строке a, но также будет соответствовать abc, bac, abracadabra и т. Д. Чтобы избежать этого, необходимо использовать символы привязки ^ и $ длясопоставьте начало и конец соответственно.Тогда ваше регулярное выражение становится ^\\d\\d\\s[A-Za-z]{1,20}$.

Я также заметил, что вы сопоставляете каждый столбец с регулярным выражением, используя цикл for for(String str : result){.Мне кажется, что вы должны сравнивать только с result[1] или pkgAddr.

Последнее замечание, взгляните на Regex 101 .Это позволит вам проверить ваши регулярные выражения с кучей входных данных, чтобы увидеть, совпадают ли они.

...