Regex найти / заменить для пар ключ / значение в строке

Я пытаюсь решить проблему с использованием 'userData', который содержит возможные заменяемые параметры, которые соответствуют регулярному выражению ${параметр} и пропускают другие формы, такие как $ параметр, потому что в нем отсутствуют скобки загадочного типа. Я также отслеживаю сменные успешные совпадения, которые он может найти на карте ключей (kvPairs). Я хочу просто предупредить, если это так.

В строке userData у меня также есть параметр, который заменяется значением, содержащим совпадение. Я бы подумал, что матч позиционно не будет оцениваться, но он выдает исключение:

В общем, как мой подход? я могу улучшить это вообще?

exception in thread "main" java.lang.IllegalArgumentException: No group with name {myVariable}
    at java.util.regex.Matcher.appendReplacement(Matcher.java:849)
    at java.util.regex.Matcher.replaceFirst(Matcher.java:1004)
    at 
utils.Regex.getKeyValueSubstitutedUserData(Regex.java:36)
    at utils.Regex.main(Regex.java:77)

Я могу решить заблокировать это. Но мне интересно, какого черта это терпит неудачу. Это сброс положения и переоценка матча?

package Utils;

import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Regex {

   public Regex() {}

   private String getKeyValueSubstitutedUserData(Map<String, String> kvPairs, String userData) {

       String patternToFind = "(\\$\\{)(.+?)(\\})";
       Pattern regex = Pattern.compile( patternToFind );

       Matcher match = regex.matcher( userData );
       Set<String> missingKeys = new LinkedHashSet<>();
       while ( match.find()) {

           String key2 = match.group(2);

           if ( key2 != null ) {

              String value = kvPairs.get( key2 );

              if ( value != null ) {
                  userData = match.replaceFirst( value );
                  match.reset( userData );
              }
              else {
                  // Found a missing variable
                  missingKeys.add( key2 );
              }
          }
      }


      return userData;
  }

  public static void main(String[] args) {

      Regex regexUtil = new Regex();

      Map<String, String> kvPairs = new HashMap<> ();
      kvPairs.put( "LOCALHOSTIP", "10.234.158.5" );
      kvPairs.put( "METADATA_POLL_FREQ" , "60");
      kvPairs.put( "router1_eth0_cidr" , "10.234.158.0/24");
      kvPairs.put( "router1_eth0_gateway" , "10.234.158.1");
      kvPairs.put( "router1_eth0_mac_addresss" , "fa:16:3e:6f:4a:c3");
      kvPairs.put( "EVENT_TYPE" , "BOOT");
      kvPairs.put( "testFIP" , "_FIP_router_eth0");
      kvPairs.put( "METADATA_TIMESTAMP" , "1");
      kvPairs.put( "vnfInstanceNumber" , "1");
      kvPairs.put( "TestFIPVIP" , "_FIP_VIP_router_eth0");
      kvPairs.put( "router1_eth0" , "10.234.158.5");
      kvPairs.put( "myVariable" , "193.167.1.1");
      kvPairs.put( "HOSTNAME" , "router1");
      kvPairs.put( "METADATA_SCRIPT" , "erg");
      kvPairs.put( "_FIP_router1_eth0" , "10.2.31.42");
      kvPairs.put( "LOCALHOST" , "router1");
      kvPairs.put( "testVIP" , "_VIP_router_eth0");
      kvPairs.put( "HOSTNAMEIP" , "10.234.158.5");
      kvPairs.put( "TestNesting" , "${myVariable}");

      String userData = "abcShell script \n${HOSTNAMEIP} blah blah \n ${\nrouter1_eth0_gateway} ${HOSTNAME} $HOSTNAME ${EVENT_TYPE} ${foobar} ${TestNesting} ${_FIP_router1_eth0}";

      regexUtil.getKeyValueSubstitutedUserData( kvPairs, userData);

    }
}

0 ответов

Другие вопросы по тегам