【问题标题】:construct string from regular expression and results (inverse for matching)从正则表达式和结果构造字符串(逆匹配)
【发布时间】:2014-11-06 21:43:14
【问题描述】:

有什么可靠的方法可以从给定的正则表达式和“匹配”的结果构造字符串?

我正在寻找类似的东西:

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

结果为“我的名字是约翰”。所以我需要逆功能来匹配正则表达式。

任何非异国语言的答案都是合适的。

【问题讨论】:

标签: javascript php python regex preg-match


【解决方案1】:

简短的回答是“否”——这不是正则表达式的用途。

但是,你可以这样做:

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&lt;name&gt;.*)/', '/(?P&lt;name&gt;.*)/', "John");

【讨论】:

  • 谢谢长答案也是“否”我想我需要“猜测”原始输入字符串,只有正则表达式和匹配的结果。我不知道正则表达式的结构。这是一个模棱两可的程序。我只能用提供的数据替换顶级命名子模式,忽略很多正则表达式部分(未命名的通配符)
【解决方案2】:

您可以编写自己的函数。我在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;
  }

【讨论】:

    猜你喜欢
    • 2012-11-29
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2012-06-05
    • 2013-12-25
    相关资源
    最近更新 更多