在 JavaScript 中提取值作为占位符变量
Extract values as placeholder variables in JavaScript
This is the opposite problem to Efficient JavaScript String Replacement. That solution covers the insertion of data into placeholders whilst this question covers the matching of strings and the extraction of data from placeholders.
我无法理解如何在 ES6 中执行以下操作 JavaScript。
我想找出一种方法来匹配字符串与占位符并将占位符的内容提取为对象的属性。也许一个例子会有所帮助。
给定模式:
my name is {name} and I live in {country}
它将匹配字符串:
my name is Mark and I live in England
并提供对象:
{
name: "Mark",
country: "England"
}
目的是获取一个字符串并对照多种模式进行检查,直到找到匹配项,然后才能访问占位符值。
谁能给我指出正确的方向...
如果可以用正则表达式来完成,我会感到很惊讶。
我的想法是这样的:
- 将模板拆分为
{
或 }
- 迭代后面的模板部分(每隔一个从索引 1 开始)
- 在每次迭代中,获取键、它的前缀和后缀(或下一个前缀)
- 然后我们可以计算开始和结束索引,以在上述帮助下从字符串中提取值。
const extract = (template, str) => {
const templateParts = template.split(/{|}/);
const extracted = {};
for (let index = 1; index < templateParts.length; index += 2) {
const
possibleKey = templateParts[index],
keyPrefix = templateParts[index - 1],
nextPrefix = templateParts[index + 1];
const substringStartIndex = str.indexOf(keyPrefix) + keyPrefix.length;
const substringEndIndex = nextPrefix ? str.indexOf(nextPrefix) : str.length;
extracted[possibleKey] = str.substring(substringStartIndex, substringEndIndex);
}
return extracted;
}
console.log( extract('my name is {name} and I live in {country}', 'my name is Mark and I live in England') );
您可以使用 named capture groups 解决该问题,例如
const string = "my name is Mark and I live in England";
const regEx = /name is\s(?<name>\w+?)\b.*?live in (?<country>\w+?)\b/i;
const match = regEx.exec(string);
console.log(match?.groups);
This is the opposite problem to Efficient JavaScript String Replacement. That solution covers the insertion of data into placeholders whilst this question covers the matching of strings and the extraction of data from placeholders.
我无法理解如何在 ES6 中执行以下操作 JavaScript。
我想找出一种方法来匹配字符串与占位符并将占位符的内容提取为对象的属性。也许一个例子会有所帮助。
给定模式:
my name is {name} and I live in {country}
它将匹配字符串:
my name is Mark and I live in England
并提供对象:
{
name: "Mark",
country: "England"
}
目的是获取一个字符串并对照多种模式进行检查,直到找到匹配项,然后才能访问占位符值。
谁能给我指出正确的方向...
如果可以用正则表达式来完成,我会感到很惊讶。
我的想法是这样的:
- 将模板拆分为
{
或}
- 迭代后面的模板部分(每隔一个从索引 1 开始)
- 在每次迭代中,获取键、它的前缀和后缀(或下一个前缀)
- 然后我们可以计算开始和结束索引,以在上述帮助下从字符串中提取值。
const extract = (template, str) => {
const templateParts = template.split(/{|}/);
const extracted = {};
for (let index = 1; index < templateParts.length; index += 2) {
const
possibleKey = templateParts[index],
keyPrefix = templateParts[index - 1],
nextPrefix = templateParts[index + 1];
const substringStartIndex = str.indexOf(keyPrefix) + keyPrefix.length;
const substringEndIndex = nextPrefix ? str.indexOf(nextPrefix) : str.length;
extracted[possibleKey] = str.substring(substringStartIndex, substringEndIndex);
}
return extracted;
}
console.log( extract('my name is {name} and I live in {country}', 'my name is Mark and I live in England') );
您可以使用 named capture groups 解决该问题,例如
const string = "my name is Mark and I live in England";
const regEx = /name is\s(?<name>\w+?)\b.*?live in (?<country>\w+?)\b/i;
const match = regEx.exec(string);
console.log(match?.groups);