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