用正则表达式替换字符串无法正常工作

时间:2018-12-14 11:19:19

标签: java regex

我正在尝试使用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,因此我认为正则表达式无法正常工作。 有什么解决办法吗?

1 个答案:

答案 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#replaceAllString#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