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);
}
}