Существует ли какой-либо надежный способ построения строки из заданного регулярного выражения и "совпадающих" результатов?
Я ищу что-то вроде:
stringConstruct('/My name is (?P<name>.*)/', {name: John});
с результатом "Меня зовут Джон". Поэтому мне нужна обратная функциональность для соответствия регулярному выражению.
Ответ на любой неэкотический язык подходит.
Вы можете написать свою собственную функцию. Я сделал это один раз на Java, вот пример. sb - это строка, над которой нужно работать. replaceMap - это карта (regexp, replaceStr):
public static boolean replaceAll(StringBuffer sb, Map<String,String> replaceMap)
{
boolean altered = false;
Iterator<String> it = replaceMap.keySet().iterator();
while (it.hasNext())
{
String toReplace = it.next();
Matcher mat = Pattern.compile(toReplace).matcher(sb);
while (mat.find())
{
if (!altered)
{
altered = true;
}
String str = (String) replaceMap.get(toReplace);
sb.replace(mat.start(), mat.end(), str);
mat.region(mat.start() + str.length(), sb.length());
}
}
return altered;
}
Короткий ответ - "Нет" - это не то, для чего существует регулярное выражение.
но вы можете сделать что-то вроде:
function stringConstruct($stringTemplate, $regex, $input){
if(preg_match($regex, $input)){
return str_replace($regex, $input, $stringTemplate);
} else {
return false;
}
}
Но вам придется использовать его следующим образом:
echo stringConstruct('My name is/(?P<name>.*)/', '/(?P<name>.*)/', "John");