найти слово в позиции в JavaScript - PullRequest
6 голосов
/ 02 марта 2011

Для строкового ввода 'это предложение' оно должно возвращать 'это', когда позиция равна 6 или 7. Когда позиция равна 0, 1, 2, 3 или 4, результат должен быть 'this'.

Какой самый простой способ?

Ответы [ 5 ]

15 голосов
/ 03 марта 2011
function getWordAt (str, pos) {

    // Perform type conversions.
    str = String(str);
    pos = Number(pos) >>> 0;

    // Search for the word's beginning and end.
    var left = str.slice(0, pos + 1).search(/\S+$/),
        right = str.slice(pos).search(/\s/);

    // The last word in the string is a special case.
    if (right < 0) {
        return str.slice(left);
    }

    // Return the word, using the located bounds to extract it from the string.
    return str.slice(left, right + pos);

}

Эта функция принимает любой символ пробела в качестве разделителя слов, включая пробелы, символы табуляции и символы новой строки. По сути, это выглядит:

  • Для начала слова соответствует /\S+$/
  • Сразу за концом слова, используя /\s/

Как написано, функция вернет "", если задан индекс символа пробела; пробелы не являются частью самих слов. Если вы хотите, чтобы функция вместо возвращала предыдущее слово , измените /\S+$/ на /\S+\s*/.


Вот пример вывода для "This is a sentence."

0: This
1: This
2: This
3: This
4:
5: is
6: is
7:
8: a
9:
10: sentence.
// ...
18: sentence.

Модифицировано для возврата предыдущего слова, вывод становится:

0: This
1: This
2: This
3: This
4: This
5: is
6: is
7: is
8: a
9: a
10: sentence.
// ...
18: sentence.
3 голосов
/ 03 марта 2011
var str = "this is a sentence";

function GetWordByPos(str, pos) {
    var left = str.substr(0, pos);
    var right = str.substr(pos);

    left = left.replace(/^.+ /g, "");
    right = right.replace(/ .+$/g, "");

    return left + right;
}

alert(GetWordByPos(str, 6));

PS Не проверен полностью и пока не обрабатывает ошибки.

1 голос
/ 03 марта 2011
function getWordAt(s, pos) {
  // make pos point to a character of the word
  while (s[pos] == " ") pos--;
  // find the space before that word
  // (add 1 to be at the begining of that word)
  // (note that it works even if there is no space before that word)
  pos = s.lastIndexOf(" ", pos) + 1;
  // find the end of the word
  var end = s.indexOf(" ", pos);
  if (end == -1) end = s.length; // set to length if it was the last word
  // return the result
  return s.substring(pos, end);
}
getWordAt("this is a sentence", 4);
1 голос
/ 03 марта 2011
function getWordAt(str, pos) {

   // Sanitise input
   str = str + "";
   pos = parseInt(pos, 10);

   // Snap to a word on the left
   if (str[pos] == " ") {
      pos = pos - 1;
   }

   // Handle exceptional cases
   if (pos < 0 || pos >= str.length-1 || str[pos] == " ") {
      return "";
   }

   // Build word
   var acc = "";
   for ( ; pos > 0 && str[pos-1] != " "; pos--) {}
   for ( ; pos < str.length && str[pos] != " "; pos++) {
      acc += str[pos];
   }

   return acc;
}

alert(getWordAt("this is a sentence", 6));

Как то так.Обязательно тщательно протестируйте логику цикла;Я не сделал.

0 голосов
/ 12 июля 2019

Я получил собственное решение.

Примечание 1: регулярные выражения не проверяются полностью.

Примечание 2: это решение быстрое (даже для больших строк) и работает дажеесли позиция (pos аргумент) находится в середине слова.

function getWordByPosition(str, pos) {
  let leftSideString = str.substr(0, pos);
  let rightSideString = str.substr(pos);

  let leftMatch = leftSideString.match(/[^.,\s]*$/);
  let rightMatch = rightSideString.match(/^[^.,\s]*/);

  let resultStr = '';

  if (leftMatch) {
      resultStr += leftMatch[0];
  }

  if (rightMatch) {
      resultStr += rightMatch[0];
  }

  return {
      index: leftMatch.index,
      word: resultStr
  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...