我正在尝试使用iText处理pdf中的字符串,但是当我在replace方法中设置正则表达式时,我遇到了问题。
PdfReader reader = new PdfReader(src);
PdfDictionary dict = reader.getPageN(1);
PdfObject object = dict.getDirectObject(PdfName.CONTENTS);
if (object instanceof PRStream) {
PRStream stream = (PRStream)object;
byte[] data = PdfReader.getStreamBytes(stream);
stream.setData(new String(data).replace("^(0?[1-9]|[12][0-9]|3[01])[\\/\\-](0?[1-9]|1[012])[\\/\\-]\\d{4}$", getData()).getBytes());
}
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.close();
reader.close();
例如,它应该从12/12/2018更改为我使用getData()方法获得的日期,但是在新的pdf中仍然存在12/12/2018,因此我认为正则表达式无法正常工作。 有什么解决办法吗?
答案 0 :(得分:2)
String#replace
不支持正则表达式,它将尝试从字面上替换您的字符串,请注意String#replace
的源代码中的Pattern.LITERAL
:
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
您要查找的方法是String#replaceAll
或String#replaceFirst
,这两种方法都以正则表达式作为输入。
String regex = "^(0?[1-9]|[12][0-9]|3[01])[\\/\\-](0?[1-9]|1[012])[\\/\\-]\\d{4}$";
String date = "12/12/2018";
System.out.println(date); // Prints 12/12/2018
date = date.replaceAll(regex, "myNewValue");
System.out.println(date); // Prints myNewValue