Java 多行正则表达式匹配器

Java 多行正则表达式匹配器,java,regex,multiline,Java,Regex,Multiline,有内容为的输入文件: xx0000220000 XX00003300000 regexp: (.{6}22.{5}\W)(.{6}33.{5}) 在Regex Coach(用于regexp测试的应用程序)中尝试,字符串匹配正常 爪哇: patternString是作为bean属性从.xml添加的regexp(如上所述) 它在Java中失败。简单的解决方案:“{6}22.{5}\\s+.{6}33.{5}”。请注意,\s+是后续空白元素的一种类型 举个例子: public static voi

有内容为的输入文件:
xx0000220000
XX00003300000

regexp:

(.{6}22.{5}\W)(.{6}33.{5})
在Regex Coach(用于regexp测试的应用程序)中尝试,字符串匹配正常

爪哇:

patternString
是作为bean属性从.xml添加的regexp(如上所述)

它在Java中失败。

简单的解决方案:
“{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正则表达式,您可以使用:(免费在线编辑器)

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

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();
}

进口产品,如:

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;

请尝试在分隔符中进行此更改:

 scanner.useDelimiter("\\s+");
还有,为什么不使用更通用的正则表达式,如下所示:

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

您上面提到的正则表达式适用于2行。既然您提到分隔符是一个新行,那么您应该给出一个适用于一行的正则表达式。

请原谅我的无知,但我仍然不确定您到底要搜索什么。在这种情况下,您尝试搜索字符串(使用新行)

那你为什么要用新的线来界定它呢

要按原样读取上述字符串,以下代码起作用

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

什么是
模式字符串
?你分配了什么?你是怎么分配的?您确信您的反斜杠是正则表达式中的文字反斜杠吗?更不用说,您实际在哪里使用pattern?@Pace i use:String val=scanner.next(pattern);谢谢您的回答,这个regexp需要从消息队列中提取确定的字符串缓冲区,这个字符串缓冲区从字符串22开始,以字符串33结束。实际上,在这些字符串之间将是结构相似的字符串,也用LR或LF分隔。我不太明白。我的回答对你有帮助吗?如果没有,请通过编辑你的问题详细解释上述问题。嗨,Margus。有趣的是,我尝试了你提出的regexp:.{6}22.{5}\\s+.{6}33.{5}在“Regex Coach”应用程序中。它工作正常(没有一个反斜杠)。From Java id不起作用,非常奇怪。我应该以某种方式将InputStrem转换为FileInputStream以调用getChannel()方法吗?如何将scanner与InputStream一起使用?如果scanner=new scanner(inputStream,charsetName),则它不支持read方法。我不知道为什么需要使用scanner从文件中读取,但如果是这样,则最好使用文件中找不到的分隔符,例如scanner.useDelimiter(\\?);它将提示扫描程序从文件中获取整个字符串
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();
        }
XX00002200000
XX00003300000