Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从任意正则表达式创建字符串模板?_Javascript_Regex_String_Format_String Formatting - Fatal编程技术网

Javascript 从任意正则表达式创建字符串模板?

Javascript 从任意正则表达式创建字符串模板?,javascript,regex,string,format,string-formatting,Javascript,Regex,String,Format,String Formatting,正则表达式用于解析已格式化的字符串,但我想使用它们获取原始字符串并对其进行格式化,例如: // phone number format("\(\d{3}\) \d{3}-\d{4}", "1234567890"); // should return "(123) 456-7890" 以上只是示例,我想要一个适用于任意正则表达式和任意字符串(适合正则表达式)的通用解决方案 到目前为止,我所拥有的有点不雅观,能力有限,但确实满足上面3个例子中的前2个: 函数消耗字符数(金额){ 返回(chara

正则表达式用于解析已格式化的字符串,但我想使用它们获取原始字符串并对其进行格式化,例如:

// phone number
format("\(\d{3}\) \d{3}-\d{4}", "1234567890");
// should return "(123) 456-7890"
以上只是示例,我想要一个适用于任意正则表达式和任意字符串(适合正则表达式)的通用解决方案

到目前为止,我所拥有的有点不雅观,能力有限,但确实满足上面3个例子中的前2个:

函数消耗字符数(金额){
返回(characterArray)=>{
返回characterArray.splice(0,amount).join(“”);
};
}
函数parseSimpleRegex(regexString){
//过滤掉反斜杠转义
让parsed=regexString.replace(/\\./g,(…args)=>{
返回参数[0][args[0]。长度-1];
});
//获取文字字符
让literals=parsed.split(/d\{\d\}/);
//获取变量符号
让变量=parsed.match(/d\{\d\}/g);
设varFunctions=variables.map(variable=>consumercharacters(变量[2]);
让结果=[];
while(literals.length>0){
result.push(literals.shift());
result.push(varFunctions.shift());
}
while(varFunctions.length>0){
result.push(varFunctions.shift());
}
//过滤掉未定义的字符串和空字符串
result=result.filter(resultPart=>!!resultPart);
返回结果;
}
函数格式(regexString、rawString){
让rawCharacters=rawString.split(“”);
设格式化程序=null;
试一试{
格式化程序=parseSimpleRegex(regexString);
}捕获(e){
返回“解析正则表达式失败”;
}
让formattedString=formatter.map((格式)=>{
如果(格式类型==='string'){
返回格式;
}
如果(格式类型==='function'){
返回格式(原始字符);
}
}).加入(“”);
返回格式化字符串;
}
常量测试用例=[
{
args:[“\\(\\d{3}\)\\d{3}-\\d{4}”,“1234567890”],
预期:“(123)456-7890”
},
{
args:[“\\d{4}-\\d{2}-\\d{2}”,“20180712”],
预计:“2018-07-12”
},
{
参数:[“([A-Z]+-\\d+”,“ABC123DEFGH45IJ6789”],
预期:“ABC-123 DEFGH-45 IJ-6789”
},
];
forEach((testCase,index)=>{
const result=格式(…testCase.args);
const expected=testCase.expected;
如果(结果==预期){
log(`testcase#${index+1}已通过`);
}否则{
log(`testcase#${index+1}失败,应为:${expected},result:${result}`);
}

});您可以使用模式
(\d{3})(\d{3})(\d{4})
并用
(\d{3})(\d{3})(\d{4})
替换它,这将产生
123-456-7890

对于第三个示例,使用:
(\w{3})(\w{3})(\w{5})(\w{2})(\w{2})(\w{4})
并将其替换为
\1-\2\3-\4\5-\6
,返回
ABC-123 DEFGH-45 IJ-6789

通常使用
(\w{n})…(\w{m})
,其中
n
m
是一些整数,用于将字符串的p部分捕获到特定组(您可以使用数组指定这些整数)。您还可以在数组中提供分隔符以形成模式

更新

正如我所说的,一般的解决方案是提供块的大小,该字符串应被拆分为和分隔符数组。请参阅下面的代码:

var str =  "ABC123DEFGH45IJ6789";
var blockSizes = [3,3,5,2,2,4];
var separators = ["-"," ","-"," ","-"];
var pattern = "(\\w{" + blockSizes[0] + "})";
var replacementPattern = "$1";
var i;
for(i = 1; i < blockSizes.length; i++)
{
    pattern += "(\\w{" + blockSizes[i] + "})";
    replacementPattern += separators[i - 1] + "$" + (i + 1);
}
var str=“ABC123DEFGH45IJ6789”;
var区块大小=[3,3,5,2,2,4];
变量分隔符=[“-”、“-”、“-”、”、“-”];
var pattern=“(\\w{”+块大小[0]+“})”;
var replacementPattern=“$1”;
var i;
对于(i=1;i
现在,只需使用此模式替换即可:


一般的答案是:使用一个创建
组的正则表达式,然后使用
替换
和反向引用来格式化输出

例如,使用第一个示例,使用以下正则表达式:

/(\d{3})(\d{3})(\d{4})/
它创建三个组,前3个数字,后3个数字和最后4个数字

现在,使用
string.replace
function:替换为以下替换模式:

($1) $2-$3
我将在第一个组周围添加括号,添加空格,然后添加第二个组,最后添加连字符和最后一个组

如何使用:

您可以像这样创建formatPhone功能:

function formatPhone(rawPhone)
{
    return rawPhone.replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');
}
function format(rawString, regex, replacement)
{
   return rawString.replace(regex, replacement);
}
您可以对其他模式执行类似的操作

编辑

一个完全通用的解决方案需要将原始字符串、正则表达式模式和替换模式传递给函数,如下所示:

function formatPhone(rawPhone)
{
    return rawPhone.replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');
}
function format(rawString, regex, replacement)
{
   return rawString.replace(regex, replacement);
}
其中regex和replacement必须遵循上述规则

Edit2

我想你理解错了。让我们以你的第一个例子:

format("\(\d{3}\) \d{3}-\d{4}", "1234567890");

这里的正则表达式根本不匹配
!!!因此,简而言之,您不能创建一个采用正则表达式格式的函数。正则表达式要匹配
(并且可能要替换
)如上图所示。

无论是谁否决了这个问题,你能建议我如何修改它以改进它吗?谢谢。我猜这是因为你似乎什么都没做,让我们为你做你的工作——这就是向下箭头所说的“不做研究工作”。我的研究工作是在Google和StackOverflow上搜索,但什么也没有找到,这就是促使我首先提出这个问题的原因。我用部分解决方案更新了我的问题,以显示更多的努力。我感谢这个答案,但我不知道提前会出现什么模式,因此我需要一个通用的解决方案它可以在运行时接受任何或几乎任何正则表达式,并使用它格式化字符串。@kfedorov91能否请您修改您的问题,也许可以添加更多细节,说明为什么这不能回答您的问题。@SalmanA是的,我已更新了我的问题。PoulBak的回答不够,因为它没有解释替换字符串的工作方式