JavaScript从字符串中提取令牌

3
我希望从这个字符串中提取令牌并构建一个数组(这是一个简化的例子):
SELECT * FROM {token1} WHERE {token2}

我有一个包含两个元素的数组:

myArray[0] = "token1"

myArray[1] = "token2"

有没有聪明的方法可以在不迭代字符串的情况下完成这个操作?

我也不希望数组中有重复的元素,所以

The quick {token1} dog {token2} over the {token1} wall

将会得到;

myArray[0] = "token1"

myArray[1] = "token2"

(真正的原因是为了在SQL语句中使用日期。)

Mick


巧妙的方法是循环正则表达式。只有在有固定数量的标记时,才能实现无迭代。 - Shilly
解析SQL查询并不是那么简单... - DontVoteMeDown
你不需要解析查询。你需要解析 { 和 } 之间的所有内容,我从未见过在 SQL 查询中使用它们,所以可能很简单。我在 Node 中使用相同的系统,还没有遇到问题。 - Shilly
最好的方法是使用一些库来实现。例如,Dojo有一个String.substitute命令,可以像这样工作:var c = string.substitute("${replace} - ${me}", { replace: "foo", me: "bar" });。当然还有其他的例子。 - Nelson Teixeira
这个页面也很相关:https://jsperf.com/string-replacement-iteration-vs-regexp - Nelson Teixeira
3个回答

7
您可以使用replace函数对字符串进行正则表达式循环,并提取令牌:

var sql = 'SELECT * FROM {token1} WHERE {token2}';

var tokens = [];

sql.replace(/\{(.*?)}/g, function(a, b) {
  tokens.push(b);
});

console.log(tokens);


这不是 .replace() 的本意所在... - Andreas
1
@Andreas,也许这不是最常见的用法,但即使在MDN的示例中,也显示了使用replace来避免在他们的文档中使用for循环。 - KevBot
1
OP要求不进行迭代。因此,replace()可能是一个不错的选择。(尽管从技术上讲它是在迭代) - m87
1
喜欢它,我没想到.replace()会在这个上下文中使用!谢谢,一直在学习 :-) - Jan Molak
为了去除重复项,请参见:https://dev59.com/PXI-5IYBdhLWcg3wO1rl - Shawn Eary

3
你可以尝试这个正则表达式
(?:{)([^}]*)(?:})

Example code:

var str = 'SELECT * FROM {token1} WHERE {token2}';
var regex = new RegExp('(?:{)([^}]*)(?:})', 'g');
var match, myArray = [];
while (match = regex.exec(str)) myArray.push(match[1]);
console.log(myArray);


0

function getTokens(str) {
  var results = [], re = /{([^}]+)}/g, text;

  while(text = re.exec(str)) {
    results.push(text[1]);
  }
  return results;
}

var myString = "SELECT * FROM {token1} WHERE {token2}";

console.log(getTokens(myString));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接