我有一个将输入流转换为String的代码片段。然后使用java.util.regex.Matcher查找字符串中的内容。
下面的适用于我:
StringBuilder sb = new StringBuilder();
InputStream ins; // the InputStream data
BufferedReader br = new BufferedReader(new InputStreamReader(ins));
br.lines().forEach(sb::append);
br.close();
String data = sb.toString();
Pattern pattern = Pattern.compile(".*My_PATTERN:(.*)");
Matcher matcher = pattern.matcher(data);
if (matcher.find())
String searchedStr = matcher.group(1); // I find a match here
但是如果我尝试用Apache IOUtils替换BufferedReader,我找不到任何与相同字符串的匹配。
InputStream ins; // the InputStream data
String data = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
Pattern pattern = Pattern.compile(".*My_PATTERN:(.*)");
Matcher matcher = pattern.matcher(data);
if (matcher.find())
String searchedStr = matcher.group(1); // I cannot find a match here
我试过用其他"标准字符集";除了UTF-8,但没有一个成功。
我无法理解这里有什么不同,会导致ioutil不匹配。有人能帮我一下吗?
第一个代码删除了行煞车,第二个代码没有。
所以你应该定义多行模式匹配:
- 在模式中(以标志s=dotall, m=multiline开始)
Pattern pattern = Pattern.compile("(?sm).*My_PATTERN:(.*)");
- 模式v2
Pattern pattern = Pattern.compile("[\s\S]*My_PATTERN:([\s\S]*)");
- With flags
Pattern pattern = Pattern.compile(".*My_PATTERN:(.*)", MULTILINE|DOTALL);
所有匹配组值中的line brakes。
或者删除换行符,例如:
data = data.replaceAll("\r?\n", "");
看:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html编译(以% 20 int)
https://docs.oracle.com/javase/tutorial/essential/regex/pattern.html