Замена строки на регулярное выражение не работает должным образом - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь использовать iText для манипулирования строками в моем pdf, но у меня возникает проблема, когда я задаю выражение регулярного выражения в методе замены, он не работает.

    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 голосов
/ 14 декабря 2018

String#replace не поддерживает регулярное выражение, он попытается заменить вашу строку буквально, обратите внимание на Pattern.LITERAL в исходном коде String#replace:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...