arunmmanoharan
arunmmanoharan

Reputation: 2675

Remove the last word of a string if the last before word is a number and increment the number - JS

I have a string and I need to remove the last word of a string if the last before word is a number and increment the number. If the last before word is not a number, we keep checking until the same word has occurred and throw the count along with the word. This is an extension of Count string occurrence and replace with string and count - JS - The latter part is working. Unable to get the first example working. Please advice.

Example:

  1. Model transfer 2 transfer - Model transfer 3 //Expected output
  2. Model transfer transfer Transfer - Model transfer 3 //Expected output
  3. Model transfertransfer Transfer Transfer - Model transfer 4 //Expected output
  4. Model transfer - Model transfer //Expected output
  5. Model - Model //Expected output

var name = "Model Transfer 2 transfer";
const name1 = 'Model transfer model transfer';
const name2 = 'Model transfer transfer transfer';
const name3 = 'Model Transfer transfer Transfer';
const name4 = 'Model transfer transfer transfer';
const renameNameOccurrence = (
  name,
  occurrenceName
) => {
  var regExp = new RegExp(`(?<=${occurrenceName}\\s)(.+?)(?=\\s+${occurrenceName})`, "ig");
  var results = Number(name.match(regExp)[0]);
  if (typeof results == 'number') {
    const abc = name.replace(/\w+[.!?]?$/, '');
  }
  const nameSplit = name.split(" ");
  const occurrenceCount = (
    name.match(new RegExp(`${occurrenceName}`, "gi")) || []
  ).length;
  let modifiedName = "";
  if (occurrenceCount > 1) {
    for (let i = 0; i < nameSplit.length - 1; i++) {
      if (nameSplit[i].toLowerCase() === nameSplit[i + 1].toLowerCase()) {
        if (occurrenceCount > 1) {
          modifiedName = name
            .replace(new RegExp(`\\s*${occurrenceName}\\s*`, "gi"), "")
            .concat(` ${occurrenceName.toLowerCase()} ${occurrenceCount}`);
        } else {
          modifiedName = name;
        }
      } else {
        modifiedName = name;
      }
    }
  } else {
    modifiedName = name;
  }

  return modifiedName;
};


console.log('name', renameNameOccurrence(name, 'transfer')); //Model Transfer 3
console.log('name1', renameNameOccurrence(name1, 'transfer')); //Model transfer model transfer
console.log('name2', renameNameOccurrence(name2, 'transfer')); //Model transfer 3
console.log('name3', renameNameOccurrence(name3, 'transfer')); //Model transfer 3
console.log('name4', renameNameOccurrence(name4, 'transfer')); //Model transfer 3

Upvotes: 1

Views: 70

Answers (1)

GetSet
GetSet

Reputation: 1577

This solution relies on split by words and an iterative approach on counting instances of transfer. It also detects if an integer precedes the last word, and if so, handles that situation as described in code below:

var name = "Model Transfer 2 transfer";
const name1 = 'Model transfer model transfer';
const name2 = 'Model transfer transfer transfer';
const name3 = 'Model Transfer transfer Transfer';
const name4 = 'Model transfer transfer transfer';

const renameNameOccurrence = (name, occurrenceName) => {
    
    // split by words as lowercased
    let s = name.toLowerCase().split(" ")  
    
    // Now count the 'transfer' words
    let t = 0;
    for (var i = 0; i < s.length; i++) {
        
        if (s[i] == "transfer") {
            t++;
        }
    }
    
    // Now see if a integer precedes last word
    
    w = s.length - 2; // -2 since length is base 1, and we need word before last
    if (w > 1) {  // excluding the assumed 1st word Model
    
        if ( parseInt( s[w] ).toString() == s[w]) {
            t++; // increment transfer words, since count is consistent
            console.log("hello")
        }
    }
    
    // Now recompose the string
    
    
    
    if (t > 1) {
        
        return name.split(" ")[0] + " Transfer " + t
    
    }
    else if (t > 0) {
        return name.split(" ")[0] + " Transfer"
    }
    else {
        return name.split(" ")[0]
    }
    
    
}

/*

Model transfer 2 transfer - Model transfer 3 //Expected output
Model transfer transfer Transfer - Model transfer 3 //Expected output
Model transfertransfer Transfer Transfer - Model transfer 4 //Expected output
Model transfer - Model transfer //Expected output
Model - Model //Expected output

*/

console.log( renameNameOccurrence( "Model transfer 2 transfer" ))
console.log( renameNameOccurrence( "Model transfer transfer Transfer" ))
console.log( renameNameOccurrence( "Model transfer transfer Transfer Transfer" ))
console.log( renameNameOccurrence( "Model transfer" ))
console.log( renameNameOccurrence( "Model" ))

Upvotes: 1

Related Questions