Javascript. Обратный порядок слов в строке, но не специальных символов

Здравствуйте, я надеюсь, что кто-то сможет дать мне отзыв о моем решении этой проблемы. Если есть дополнительные крайние случаи, я должен рассмотреть и т. Д. Спасибо!

Вопрос: «Для предложения с набором разделителей измените порядок слов в предложении и оставьте разделители на месте».

let isAlpha = (char) => {
  let pat = /[a-zA-z]/igm;     // match any alphabetic character
  if(char.match(pat)){
      return true
  } else {
      return false
  }
}

function reverse(s){
  
  let specialArr = []   

  for(ltr of s){ 
    if(!isAlpha(ltr)){                        // pull out all special characters in order
      specialArr.push(ltr)
    } 
  }
  
  let regCharArr = s.split(/[^a-z]/ig).reverse()     // use split to pull out all words separated by non alpha characters. then reverse
  
  let result = []                                    // init result array
  
  if(isAlpha(s[0])){
    result = regCharArr.flatMap((val, idx) => [val, specialArr[idx]])   //use flatmap to combine the two arrays...if origin array starts with letter, combine special array into reg array
  }
  
  if(!isAlpha(s[0])){
    result = specialArr.flatMap((val, idx) => [val, regCharArr[idx]])    // vice versa
  }

  for(let i = 0; i < result.length; i++){         // remove any undefineds
    if(result[i] === undefined){
      result.splice(i, 1)
    }
  }
  return result.join('')
}


// let sentence = "one|twotwo/three:four"  // four|three/twotwo:one
let sentence = "|brian/steve:chris|jon"     // |jon/chris:steve|brian

console.log(reverse(sentence))

```

1 ответ
1

Текущая реализация isAlpha

let isAlpha = (char) => {
  // match any alphabetic character.
  let pat = /[a-zA-z]/igm;

  if(char.match(pat)){
    return true;
  } else {
    return false;
  }
};

… можно реорганизовать во что-то вроде этого …

function isAlpha(char) {
  return (/[a-zA-z]/).test(char);
};

… а может даже это …

function isAlpha(char) {
  // w matches any word character
  // and is equal to [a-zA-Z0-9_]
  return (/w/).test(char);
};

Почему это?

isAlpha вызывается изнутри reverse всегда предоставляя один символ. Таким образом, регулярное выражение можно упростить с /[a-zA-z]/igm к /[a-zA-z]/. С isAlpha должен возвращать логическое значение не использовать match и не возвращайся тоже true или же false отдельно, но используйте RegExp.prototype.test вместо этого, который уже предоставляет правильное возвращаемое значение.

На этом пока все, но я продолжу просматривать код, так как на данный момент я не понимаю, почему нужно тестировать строку пошагово символ за символом.

Есть мой ответ на ваш вопрос в StackOverflow. Может быть, вас вдохновит альтернативный подход.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *