【发布时间】:2014-11-06 21:43:14
【问题描述】:
有什么可靠的方法可以从给定的正则表达式和“匹配”的结果构造字符串?
我正在寻找类似的东西:
stringConstruct('/My name is (?P<name>.*)/', {name: John});
结果为“我的名字是约翰”。所以我需要逆功能来匹配正则表达式。
任何非异国语言的答案都是合适的。
【问题讨论】:
标签: javascript php python regex preg-match
有什么可靠的方法可以从给定的正则表达式和“匹配”的结果构造字符串?
我正在寻找类似的东西:
stringConstruct('/My name is (?P<name>.*)/', {name: John});
结果为“我的名字是约翰”。所以我需要逆功能来匹配正则表达式。
任何非异国语言的答案都是合适的。
【问题讨论】:
标签: javascript php python regex preg-match
简短的回答是“否”——这不是正则表达式的用途。
但是,你可以这样做:
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");
【讨论】:
您可以编写自己的函数。我在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;
}
【讨论】: