Многострочный регулярное выражение - PullRequest
2 голосов
/ 11 октября 2010

Есть входной файл с содержанием:
XX0000 22 * ​​1002 * 00000
XX0000 33 00000

регулярное выражение:

(.{6}22.{5}\W)(.{6}33.{5})

Попробовано в Regex Coach (приложение для тестирования регулярных выражений), строки соответствуют OK.

Java:

        pattern = Pattern.compile(patternString);
        inputStream = resource.getInputStream();

        scanner = new Scanner(inputStream, charsetName);
        scanner.useDelimiter("\r\n");

patternString - это регулярное выражение (упомянутое выше), добавленное как свойство bean из .xml

Это не удалось с Java.

Ответы [ 3 ]

2 голосов
/ 11 октября 2010

Простое решение: ".{6}22.{5}\\s+.{6}33.{5}". Обратите внимание, что \s+ является сокращением для последующих элементов пробела.

Вот пример:

 public static void main(String[] argv) throws FileNotFoundException {
  String input = "yXX00002200000\r\nXX00003300000\nshort", regex = ".{6}22.{5}\\s+.{6}33.{5}", result = "";
  Pattern pattern = Pattern.compile(regex);
  Matcher m = pattern.matcher(input);

  while (m.find()) {
   result = m.group();
   System.out.println(result);
  }
 }

С выходом:

XX00002200000
XX00003300000

Для игры с Java Regex вы можете использовать: Редактор регулярных выражений (бесплатный онлайн-редактор)

Редактировать: Я думаю, что вы меняете ввод при чтении данных, попробуйте:

public static String readFile(String filename) throws FileNotFoundException {
    Scanner sc = new Scanner(new File(filename));

    StringBuilder sb = new StringBuilder();
    while (sc.hasNextLine())
        sb.append(sc.nextLine());
    sc.close();

    return sb.toString();
}

Или

static String readFile(String path) {
    FileInputStream stream = null;
    FileChannel channel = null;
    MappedByteBuffer buffer = null;

    try {
        stream = new FileInputStream(new File(path));
        channel = stream.getChannel();
        buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0,
                channel.size());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            stream.close();
        } catch (Exception e2) {
            e2.printStackTrace();
        }
    }

    return Charset.defaultCharset().decode(buffer).toString();
}

С импортом, как:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
0 голосов
/ 12 октября 2010

Простите за мое невежество, но я все еще не уверен, что именно вы пытаетесь найти. В случае, если вы пытаетесь найти строку (с новыми строками)

XX00002200000
XX00003300000

тогда почему вы читаете это, разделяя его новыми строками?

Чтобы прочитать приведенную выше строку как есть, работает следующий код

Pattern p = Pattern.compile(".{6}22.{5}\\W+.{6}33.{5}");

 FileInputStream scanner = null;
        try {
            scanner = new FileInputStream("C:\\new.txt");
            {
                byte[] f = new byte[100];
                scanner.read(f);
                String s = new String(f);
                Matcher m = p.matcher(s);
                if(m.find())
                    System.out.println(m.group());
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Примечание: здесь файл new.txt содержит строку

XX00002200000
XX00003300000
0 голосов
/ 11 октября 2010

Попробуйте это изменение в разделителе:

 scanner.useDelimiter("\\s+");

также, почему бы вам не использовать более общее выражение регулярного выражения, подобное этому:

 ".{6}[0-9]{2}.{5}"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...