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

0

Существует ли какой-либо надежный способ построения строки из заданного регулярного выражения и "совпадающих" результатов?

Я ищу что-то вроде:

stringConstruct('/My name is (?P<name>.*)/', {name: John});

с результатом "Меня зовут Джон". Поэтому мне нужна обратная функциональность для соответствия регулярному выражению.

Ответ на любой неэкотический язык подходит.

Теги:
preg-match

2 ответа

0

Вы можете написать свою собственную функцию. Я сделал это один раз на 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;
  }
0

Короткий ответ - "Нет" - это не то, для чего существует регулярное выражение.

но вы можете сделать что-то вроде:

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

  • 0
    спасибо Длинный ответ также «Нет», я думаю, мне нужно «угадать» исходную строку ввода, имеющую только регулярное выражение и соответствующие результаты. Я не знаю структуру регулярных выражений. Это неоднозначная процедура. Я могу заменить только именованные дочерние узлы верхнего уровня предоставленными данными, игнорируя множество частей регулярных выражений (безымянные подстановочные знаки)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню