使用正则表达式比较两个字符串变量

5

假设我有两个字符串变量:

a = 'LOVE';
b = '....';

如何使用正则表达式(或其他最快的方法)将 a + b 组合成:
c = 'L.O.V.E.';

在我的情况下,这两个字符串始终都是4个字符长,并且第二个字符串不是固定字符,我只是将它设为点号以使其在屏幕上更清晰。

2
字符串长度应该匹配吗?另一个问题:另一个字符串通常是一个固定字符,比如 "." 或类似的东西? - n0m4d
1
在我的情况下,这两个字符串始终都是4个字符长。第二个字符串不是固定的字符,我只是将其设置为点以便在屏幕上更清晰地显示。 - cocacrave
6个回答

10

你可以简单地循环遍历长字符串,每次迭代将两个字符串中的一个字符附加到结果字符串中。我认为你不需要任何正则表达式:

a = 'LOVE';
b = '....';

var combinedString = ''; 
var largerLength = Math.max( a.length, b.length );

for( var i = 0; i < largerLength; i++ )
{
  combinedString += a.charAt(i) + b.charAt(i);
}//for()

console.log( combinedString );

以上代码适用于任意长度的字符串。如果您事先知道两个字符串恰好都是4个字符长,那么最快且最有效的方法应该是:

a = 'LOVE';
b = '....';
var combinedString = a.charAt[0] + b.charAt[0] + a.charAt[1] + b.charAt[1] + a.charAt[2] + b.charAt[2] + a.charAt[3] + b.charAt[3];
console.log( combinedString );

如果它们都是4个字符长,这个函数能简化吗?我不想使用for循环的原因是它太慢了,我认为用正则表达式会更快。 - cocacrave
我认为在这种情况下使用正则表达式并不会更快。正则表达式也很耗费资源,而 for 循环并不是那么慢。 - Mohit Bhardwaj
1
最好在循环之前捕获 Math.max( a.length, b.length ) 的结果 :) - Rohit416
1
@cocacrave,差异是如此微不足道,以至于它不会影响任何事情。此外,由于您正在执行的操作类型,您无需担心这个问题。很难说哪个更快。请看这里:https://ericlippert.com/2012/12/17/performance-rant/ - Rohit416
@Squint 抱歉,我不明白应该如何使用它。你是指用 a.slice(i, i + 1) 替换 a.charAt(i) 吗?那样不是一样吗? - Mohit Bhardwaj
1
简化版:combinedString += a.charAt(i) + b.charAt(i); - user1106925

6
你可以使用 Array#reduce 完成它。

var a = 'LOVE',
    b = '....';
    c = a.split('').reduce(function (r, v, i) {
        return r + v + b[i];
    }, '');

console.log(c);


这很有效,但没有考虑到当我们有不同字符串长度的情况。 - ismnoiet
尝试使用a = 'AMAROK'b = '....',你会得到A.M.A.R.O.K.,其中存在不应该存在的重复字符。 - ismnoiet
更多的点会发生什么? - Nina Scholz
2
@hamism:问题下面有一条评论指出字符串的长度将始终相同。尽管如此,由于OP没有给出完整的需求集,因此无法正确回答这些“假设情况”。 - user1106925
@hamism:非常正确。我已经更新了问题并添加了这些信息。 - user1106925
显示剩余2条评论

1
如何通过正则表达式将 ab 组合起来:

var a = "LOVE", b = "....";

var result = a.replace(/./g, (match, i) => match + b[i]);

console.log(result);


0

您可以在类似数组的数据结构(例如字符串)上使用数组函数来迭代其元素。

var a = 'LOVE',
  b = '....',
  c = Array.prototype.map
  .call(a, (v, i) => v + b[i]).join('');

console.log(c);


0

你的问题不需要正则表达式。你可以通过for循环来解决它。

a = 'LOVE';
b = '....';

var result = ''; 
var length = Math.max( a.length, b.length );
for( var i = 0; i <+ length-1; i++ )
{
    result = result + a.charAt(i); 
    result = result + b.charAt(i);
}

alert("Result of combined string is :"+ result);

-2

如果你的第二个字符串总是由组成,而不是在字符串中重复相同的字符,请尝试像这样做:

使用分隔符

var a = "LOVE";
var delimeter = ".";
var result = a.split("").join(delimeter) + delimeter;
console.log(result)

数组转换+手动拼接

作为 string.charAt 的替代方案,您可以尝试以下方法:

注意:对于值可能未定义的情况,应使用 a1[i] || ""。此外,应使用 .toString() 避免出现两个值都是数字的情况,结果将是加法而不是连接。

var a = 'LOVE';
var b = '....';
var c = ",,,,,,,,,,,";
function mergeStr(a, b) {
  var a1 = a.split("");
  var b1 = b.split("");

  var len = Math.max(a.length, b.length)
  var r = "";
  for (var i = 0; i < len; i++) {
    r += (a1[i] || "").toString() + (b1[i] || "").toString();
  }
  
  return r;
}

console.log(mergeStr(a,b))
console.log(mergeStr(a,c))


PO在注释中说第二个值不总是相同的。 - Morteza Tourani
1
@mortezaT 还有另一个代码片段可以处理这个问题。分隔符情况是针对所有值相同的情况。这只是一个建议。 - Rajesh
1
那么你应该将它改为 a.split('').join(delimiter) + delimiter; - Morteza Tourani

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