Найти и заменить шаблон строки N раз, где N определено в шаблоне - PullRequest
1 голос
/ 16 марта 2011

Я имею дело с форматированием текста из открытого текста (HL7) и переформатирую его для отображения. Примером одного является \.sp5\. Это означает поставить в пять разрывов строк.

Так что я думаю, что хотел бы сделать что-то вроде этого:

Pattern.compile("\\\.sp(\d+)\\").matcher(retval).replaceAll("\n{$1}");

Моя среда IDE сообщает мне, что на \d есть недопустимая escape-последовательность, и я не уверен, что аргумент replaceAll выполнит то, что я ожидаю. Я думаю, что регулярное выражение описывает «обратную косую черту с одной или несколькими цифрами обратной косой черты», и я хочу, чтобы замена произнесла «вставьте разрывы строки $ 1».

Как мне это сделать?

Решение представляло собой комбинацию из двух комментариев ниже:

Pattern verticalSpacesPattern = Pattern.compile("\\\\\\.sp(\\d+)\\\\", Pattern.MULTILINE);
Matcher verticalSpacesMatcher = verticalSpacesPattern.matcher(retval);

while (verticalSpacesMatcher.find()) {
    int lineBreakCount = Integer.parseInt(verticalSpacesMatcher.group(1));
    String lineBreaks = StringUtils.repeat("\n", lineBreakCount);
    String group = verticalSpacesMatcher.group(0);
    retval = StringUtils.replace(retval, group, lineBreaks);
}

Ответы [ 4 ]

1 голос
/ 16 марта 2011

Вы должны избегать обратной косой черты, чтобы компилятор игнорировал их, но механизм регулярных выражений их видел.

Обратные косые черты в строковых литералах в исходном коде Java интерпретируются в соответствии с требованиями Спецификации языка Java как Unicodeпобег или побег другого персонажа.Поэтому необходимо удвоить обратную косую черту в строковых литералах, представляющих регулярные выражения, чтобы защитить их от интерпретации компилятором байт-кода Java.

http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

replaceAll() part не будет делать то, что вы хотите (повторяя замену несколько раз), потому что нет никаких условий для этого в шаблонах замены текста.Вам нужно будет захватить целое число с помощью .group(1), преобразовать его в целое число с помощью Integer.valueOf(), а затем повторить текст замены столько раз.

1 голос
/ 16 марта 2011

используйте это:

public static void main(String[] args) throws Exception {
            // Create a pattern to match comments
            Pattern p = 
                Pattern.compile("\\\\.sp(\\d+)", Pattern.MULTILINE);

            // Get a Channel for the source file
            File f = new File("Replacement.java");
            FileInputStream fis = new FileInputStream(f);
            FileChannel fc = fis.getChannel();

            // Get a CharBuffer from the source file
            ByteBuffer bb = 
                fc.map(FileChannel.MAP_RO, 0, (int)fc.size());
            Charset cs = Charset.forName("8859_1");
            CharsetDecoder cd = cs.newDecoder();
            CharBuffer cb = cd.decode(bb);

            // Run some matches
            Matcher m = p.matcher(cb);
     int i = 0;
    int n=0;
            while (m.find())
                n= Integer.parseInt(m.group(1));  //first group,0, is the whole string , 1 is the subgroup
     for(i=0;i<n;i++)
                System.out.println("\n");   
     }
1 голос
/ 16 марта 2011

Регулярные выражения в java требуют, чтобы все косые черты были удвоены. Это потому, что «\» - это специальный символ в строках, и его необходимо экранировать лишним слешем. Так что вы, вероятно, хотите:

Pattern.compile("\\\\\\.sp(\\d+)\\\\").matcher(retval).replaceAll("\\n{$1}");
0 голосов
/ 16 марта 2011

Вы не можете использовать регулярные выражения таким образом.

Вместо этого вы должны сопоставить число (\ d +), которое вы соответствуете, с циклом, выполняющим замену .sp (\ d) +). Я никогда не видел такого типа замены, используя динамическую конструкцию, и, кстати, движок регулярных выражений должен был бы напечатать соответствующую группу, чтобы убедиться, что это число, а не строка.

Поэтому я предлагаю извлечь номер и использовать его для построения шаблона замены \n\n...\n в зависимости от номера. Тогда вы можете заменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...