формат строки шаблона регулярного выражения Java

java regex

1460 просмотра

2 ответа

Я изучаю регулярные выражения.

Постановка задачи: замените строку между # и # значениями, указанными в карте замен .

import java.util.regex.*;
import java.util.*;

public class RegExTest {
    public static void main(String args[]){

        HashMap<String,String> replacements = new HashMap<String,String>();
        replacements.put("OldString1","NewString1");
        replacements.put("OldString2","NewString2");
        replacements.put("OldString3","NewString3");

        String source = "#OldString1##OldString2#_ABCDEF_#OldString3#";

        Pattern pattern = Pattern.compile("\\#(.+?)\\#");
        //Pattern pattern = Pattern.compile("\\#\\#");
        Matcher matcher = pattern.matcher(source);
        StringBuffer buffer = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(buffer, "");
            buffer.append(replacements.get(matcher.group(1)));            
        }
        matcher.appendTail(buffer);
        System.out.println("OLD_String:"+source);
        System.out.println("NEW_String:"+buffer.toString());

    }
}

Вывод: ( Удовлетворяет моему требованию, но не знает, какая команда group (1) работает)

OLD_String:#OldString1##OldString2#_ABCDEF_#OldString3#
NEW_String:NewString1NewString2_ABCDEF_NewString3

Если я изменю код, как показано ниже

Pattern pattern = Pattern.compile("\\#(.+?)\\#");

с участием

Pattern pattern = Pattern.compile("\\#\\#");

Я получаю ниже ошибки:

Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 1

Я не поняла разницу между

"\\#(.+?)\\#" and `"\\#\\#"`

Можете ли вы объяснить разницу?

Автор: Ravindra babu Источник Размещён: 08.11.2019 10:58

Ответы (2)


2 плюса

Решение

Разница довольно проста - \\#(.+?)\\#будет сопоставлять два хэша с одним или несколькими символами между ними, а \\#\\#два хэша будут совпадать друг с другом.

Более мощный вопрос, на мой взгляд, «в чем разница между \\#(.+?)\\#и \\#.+?\\#

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

Автор: Sebastian Lenartowicz Размещён: 20.08.2016 06:51

0 плюса

. +? Говорит ему, чтобы он соответствовал (одному или нескольким) чему-либо лениво (пока он не увидит #). Поэтому, как только он анализирует один экземпляр чего-либо, он останавливается.

Я думаю, что \ # \ # будет соответствовать ##, поэтому я думаю, что ошибка в том, что он совпадает только с этим ##, и тогда есть только группа 0, нет группы 1. Но не 100% на этой части.

Автор: djb Размещён: 20.08.2016 06:51
Вопросы из категории :
32x32