多线正则表达式匹配器

时间:2010-10-11 12:31:20

标签: java regex multiline

有内容的输入文件:
XX0000的 22 00000
XX0000的 33 00000

正则表达式:

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

在Regex Coach(用于regexp测试的应用程序)中尝试过,字符串匹配正常。

爪哇:

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

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

patternString是regexp(如上所述)从.xml

添加为bean属性

Java失败了。

3 个答案:

答案 0 :(得分:2)

简单解决方案:".{6}22.{5}\\s+.{6}33.{5}"。请注意,\s+是后续空白元素的shorthand

以下是一个例子:

 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,您可以使用:Regular Expression Editor(免费在线编辑器)

编辑:我认为您在阅读数据时正在更改输入,请尝试:

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;

答案 1 :(得分:0)

在分隔符中尝试此更改:

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

为什么不使用像这样的更通用的正则表达式:

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

上面提到的正则表达式是2行。因为你已经将分隔符作为新行提到了,你应该给出一个适合单行的正则表达式。

答案 2 :(得分:0)

请原谅我的无知,但我仍然不确定你究竟想要搜索什么。如果您正在尝试搜索字符串(使用新行)

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