Как создать функцию для получения 7 слов после и до совпадения определенной строки? - PullRequest
0 голосов
/ 29 ноября 2018

Здравствуйте, я хотел бы создать функцию javascript, которая бы возвращала 7 слов до и после математики для конкретного ключевого слова

Я пытался сделать следующее:

function myFunction(text) {

    b=text.match("(?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,7}"+text+"(?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,7}");

    return b; 

Однако, когда я ищу вмой текст "создать" я просто получил:

create

Мой желаемый результат будет:

the Community, and view patterns you create or favorite in My Patterns. Explore results

Мой полный код выглядит следующим образом, с моей соответствующей строкой под названием Текст, поэтому я бынравится ценить поддержку, чтобы преодолеть эту задачу.

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>
<script>


var Text='RegExr was created by gskinner.com, and is proudly hosted by Media Temple. Edit the Expression & Text to see matches. Roll over matches or the expression for details. PCRE & Javascript flavors of RegEx are supported. The side bar includes a Cheatsheet, full Reference, and Help. You can also Save & Share with the Community, and view patterns you create or favorite in My Patterns. Explore results with the Tools below. Replace & List output custom results. Details lists capture groups. Explain describes your expression in plain English.'
function myFunction(text) {

    b=text.match("(?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,7}"+text+"(?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,7}");

    return b; 
}
document.getElementById("demo").innerHTML = myFunction("create");
</script>

</body>
</html>

Ответы [ 6 ]

0 голосов
/ 29 ноября 2018

Вы используете строку, где вы должны использовать конструктор RegExp.

Вы используете ту же самую переменную 'text' для поиска и сопоставления.Вы хотите найти 'Text' и использовать 'text' в регулярном выражении.

Вы должны добавить 'Word boundary 'вокруг вашей переменной, чтобы соответствовать словам.

Вот код:

function myFunction(text) {
    b=Text.match(new RegExp('(?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,7}\b' + text + '\b(?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,7}');
    return b; 
}

Надеюсь, что это работает для вас.

0 голосов
/ 29 ноября 2018

Как насчет этого:

(?:\w+[,\.]? ){6}create(?:[\,.]? \w+){7}
  • (?:\w+[,\.]? ) - это слово, за которым следует запятая или точка, при желании и пробел
  • {6}, обозначающий, что слово появится6 раз.
  • create соответствует самому буквально
  • (?:[\,.]? \w+){7} соответствует 7 словам с необязательной запятой или точкой и пробелом перед

Попробуйте в Regex101 или проверьте фрагмент.

var string = "RegExr was created by gskinner.com, and is proudly hosted by Media Temple. Edit the Expression & Text to see matches. Roll over matches or the expression for details. PCRE & Javascript flavors of RegEx are supported. The side bar includes a Cheatsheet, full Reference, and Help. You can also Save & Share with the Community, and view patterns you create or favorite in My Patterns. Explore results with the Tools below. Replace & List output custom results. Details lists capture groups. Explain describes your expression in plain English.";

var regex = /(?:\w+[,\.]? ){6}create(?:[\,.]? \w+){7}/;
var output = string.match(regex);

console.log(output[0]);

Фрагмент распечатывает:

Сообщество и просматривает созданные вами или избранные шаблоны в Моих шаблонах.Исследовать результаты


Редактировать: В каком случае вы включаете слово create среди 7 слов?

0 голосов
/ 29 ноября 2018

Ваше регулярное выражение отлично работает для меня.

Ваш сбой в том, что у вас есть две переменные с похожими именами: Text и text.

Измените b=text.match на b=Text.match, потому что вы хотите сопоставить строку вне вашей функции.В настоящее время вы сопоставляете выражение со строкой, содержащей только нужное слово.

Что-то еще, что нужно искать при внесении изменений: match возвращает первое вхождение "create", которое оказывается подстрокой третьегослово.Возможно, вы захотите изменить выражение, чтобы предотвратить частичное совпадение.

0 голосов
/ 29 ноября 2018

Некоторые проблемы с вашей попыткой:

  1. Регулярные выражения не являются строками.Если вы хотите создать регулярное выражение из строки, вам нужно использовать new RegExp()

  2. Переменные перепутаны.Не помогает, что одна переменная называется Text, а другая text.И в итоге вы пытаетесь найти text внутри text, что, очевидно, не то, что вы хотите.Таким образом, используйте разные имена переменных, а также передайте их оба в функцию

  3. Слово, которое вы ищете («создать»), сначала будет соответствовать «создано» в начале ввода,Поскольку регулярное выражение указывает, что все последующее является необязательным ({0,7}), это будет считаться совпадением!Чтобы избежать этого, потребуйте, чтобы за ним следовало хотя бы одно прерывание слова или конец строки.То же самое для части, которая предшествует соответствующему слову: оно не должно быть полностью необязательным.Используйте {1,7} и не требуйте слово части в нем (*).Дайте в качестве альтернативы ^ или $ соответственно.

  4. Метод match будет возвращать массив при совпадении, поэтому вы захотите вернуть значение внутри этого массива (если есть совпадение).

Таким образом, с минимальными изменениями ваш код может работать так:

var text='RegExr was created by gskinner.com, and is proudly hosted by Media Temple. Edit the Expression & Text to see matches. Roll over matches or the expression for details. PCRE & Javascript flavors of RegEx are supported. The side bar includes a Cheatsheet, full Reference, and Help. You can also Save & Share with the Community, and view patterns you create or favorite in My Patterns. Explore results with the Tools below. Replace & List output custom results. Details lists capture groups. Explain describes your expression in plain English.'
function myFunction(text, find) {
    b = text.match(new RegExp("(?:(?:[a-zA-Z'-]*[^a-zA-Z'-]+){1,7}|^)"+find+"(?:(?:[^a-zA-Z'-]+[a-zA-Z'-]*){1,7}|$)"));
    return b && b[0]; 
}
console.log( myFunction(text, "create") );

Помните, что gskinner.com, считается в вашем регулярном выражении двумя разными словами.Я предполагаю, что это было вашей целью.

0 голосов
/ 29 ноября 2018

Вы можете разбить текст на массив слов и найти индекс слова, а затем использовать Array#slice() и Array#join()

. Следующее также удаляет пунктуацию . и , для соответствия в случае, еслислово включает в себя такие знаки препинания перед следующим пробелом и нормализует регистр совпадений

var Text = 'RegExr was created by gskinner.com, and is proudly hosted by Media Temple. Edit the Expression & Text to see matches. Roll over matches or the expression for details. PCRE & Javascript flavors of RegEx are supported. The side bar includes a Cheatsheet, full Reference, and Help. You can also Save & Share with the Community, and view patterns you create or favorite in My Patterns. Explore results with the Tools below. Replace & List output custom results. Details lists capture groups. Explain describes your expression in plain English.'

var term = 'create',
  words = Text.split(' '),
  index = words.findIndex(s => s.replace(/,|\.$/, '').toLowerCase() === term.toLowerCase()),
  start = index > 6 ? index - 7 : 0;

var res = words.slice(start, index + 8).join(' ')

console.log(res)
0 голосов
/ 29 ноября 2018

Регулярные выражения - не лучший инструмент для задач такого типа.Я бы рекомендовал использовать split, чтобы разбить предложение на массив слов, а затем indexOf, чтобы найти подходящее слово и напечатать смежные слова.

Вот рабочий пример:

let sentence = "blah blah blah the Community, and view patterns you create or favorite in My Patterns. Explore results blah blah blah";
let words = sentence.split(" ");
let index = words.indexOf("create");
let result = [];

if (index > -1) {     
    for (i=index-7; i < (index+8); i++) {
        result.push(words[i]);
    }
}
    
console.log(result.join(" "));

В этом вся суть, но вам нужно изменить мой пример кода, чтобы учесть крайние случаи (т. Е. Несколько совпадающих слов, меньше 7 слов перед /после соответствующего слова).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...