检查一个字符串的结尾是否与另一个字符串的开头匹配

问题描述 投票:0回答:4

我有两根弦:

let string1 = "Some text here";
let string2 = "text here as well";

我想检查

string1
的结尾部分是否与
string2
的开头匹配。

我正在输出

string1 + string2
。就我而言,我不想两次打印相同的单词。例如,我不想打印
"Some text heretext here as well"

如何检查这一点?我尝试过

startsWith
/
endsWith
和通过从太空吐出字符串来循环。但我认为我的方法不正确,因为字符串的匹配部分的长度可能会有所不同。

字符串也可以包含破折号。例如它可以是这样的:

let string1 = "Some-text here";
let string2 = "text here as well";

在上面的示例中,理想的输出将是

"Some-text here as well"

javascript string loops
4个回答
1
投票

您可以使用 String.substring

string1
的末尾和
string2
的开头获取两个输入值的子字符串。如果这些相同,我们就发现了重叠。

let string1 = "Some-text here";
let string2 = "text here as well";

let overlap = null;
for(let i = 1; i <= string1.length; i++) {
     if (string1.substring(string1.length - i) === string2.substring(0, i)) {
         overlap = string2.substring(0, i);
         break;
     }
}

console.log('Overlap:', overlap);

let concatenated = string1.replace(overlap, '') + string2;

console.log('string1 + string2:',concatenated);


0
投票

这是一个可能的暴力解决方案:

let resultIdx = 0;
for (let idx = 0; idx < Math.min(string1.length, string2.length); idx++) {
    if (string2.substring(0, idx) === string1.substring(string1.length - idx)) {  
      resultIdx = idx
    }
 }
let result = string1 + string2.substring(resultIdx)

我们循环遍历字符串并检查是否有任何子字符串匹配。如果是这样,我们保存最后一个索引并用它来构建解决方案(保存在变量

result
中)。这是你想找的吗?


0
投票

我认为这是一个很好的问题,所以我想我应该记下我对此的想法




首先介绍一下背景

我正在解析 html 文本流以提取具有以下形式的输入字段的值

<input name="fkey" value="some--hash--value">

我正在处理来自响应的数据块,因为我在有限的内存资源内工作

我时不时地注意到我找不到搜索词,因为搜索字符串部分出现在流块的末尾




好回答问题

  • 我更改了变量名称以避免

    string1
    string2

    之间的混淆
  • 我添加了一些文本以允许多个匹配

//
        var log=(...a)=>output.append(...a,'\n');
        

        var first     = 'Some here text here';
        var second    = 'here text here as well';
        
        log(' first   ','[' +first+ ']');
        log('second   ','['+ second +']');
        
        var max   = '';
        var n     = second.length;
        for(var i=1;i<=n;i++){
        
              var sub   = second.slice(0,i);
              if(first.endsWith(sub)){
                    if(sub>max){
                          max   = sub;
                    }
                    log('\n','--  match  --');
                    log('   sub   ','['+ sub +']');
                    log(' first   ','['+ first.slice(0,-i) +']');
                    log('second   ','['+ second.slice(i) +']');
              }
              
        }//for

        log('\n','--  result  --');
        log('concat   ','['+ first+second.slice(max.length) +']');
<pre id=output></pre>




对于缪斯来说,我想我会包括从流数据中读取值的解决方案

  • 我已经执行了

    indexOf
    所以我知道搜索词没有出现在整个数据块中,这允许进一步 优化

       var s       = '';
    
       function ondata(data){
    
             s            += data;
    
             var search    = 'name="fkey"';
             var i1        = s.indexOf(search);
    
             if(i1==-1){
                   var n   = search.length;
                   for(var i=1;i<n;i++){
    
                         var sub   = search.slice(0,i);
                         if(s.endsWith(sub)){
                               s   = s.slice(-i);
                               return;
                         }
    
                   }//for
             }
    
             if(i1!=-1){
                   var i2    = s.indexOf('value="',i1);
                   if(i2!=-1){
                         var i3    = s.indexOf('"',i2+7);
                         if(i3!=-1){
                               var fkey    = s.slice(i2+7,i3);
                               complete(fkey);
                               s   = '';
                         }
                   }
                   return;
             }
             s   = '';
    
       }//ondata
    
       function complete(fkey){
    
             console.log(fkey);
    
       }//complete
    

无论如何,3 年内有 199 次观看——我不认为有人会看到这个

我很惊讶这不是一个更受欢迎的问题

祝你有美好的一天


-1
投票

let string1 = "Some-text here";
let string2 = "text here as well";
let splitString1 = string1.split(" ");
let splitString2 = string2.split(" ");
let stringSet1 = new Set(splitString1);
let stringSet2 = new Set(splitString2);

console.log(stringSet1);
console.log(stringSet2);

function wordDiff(strSet1, strSet2) {
  let _wordDiff = new Set(stringSet1);
  
  for (let elem of stringSet2) {
    if (_wordDiff.has(elem)) {} else {
      _wordDiff.add(elem);
    }
  }
  
  return _wordDiff;
}

let result = wordDiff(stringSet1, stringSet2);

console.log(result);

© www.soinside.com 2019 - 2024. All rights reserved.