有内容的输入文件:
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
Java失败了。
答案 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