JavaScript, как соответствовать целым словам, но с определенным ограничением длины - PullRequest
0 голосов
/ 09 мая 2018

Например, у меня есть две строки:

string1:

"hi sir may name is Jone"

строка2

 "hi may name is Jone"

У меня есть это регулярное выражение:

     var regex = XRegExp('hi(?:(?!hi|Jone).)*?Jone', 'gs');

будет соответствовать им обоим, но я хочу изменить регулярное выражение, чтобы оно соответствовало только ограниченной длине всей строки

я хочу сопоставить строку два "привет, может, зовут Джона", так как имел меньше слов, как это сделать ..

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

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

Как пример с массивом строк, вы можете создать var longestString = "";, который будет в конце цикла содержать самую короткую совпадающую строку.

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

var strings = [
  "test",
  "hi sir may name is Jone",
  "hi may name is Jone",
  "hi Jone",
  "hi may name is Jone test",
  "hi i am Jone",
  "may name is Jone test",
  "hi may name is Jane test test 2"
];

var regex = /hi(?:(?!hi|Jone).)*?Jone/;
var longestString = "";

strings.forEach((str) => {
  var match = XRegExp.match(str, regex);
  if (match && longestString === "") {
    longestString = str;
    return;
  }
  if (match && str.split(" ").length < longestString.split(" ").length) {
    longestString = str;
  }
});
console.log(longestString);
<script src="https://unpkg.com/xregexp/xregexp-all.js"></script>
0 голосов
/ 09 мая 2018

Если вы хотите сопоставить ограниченную длину всей строки, используя только регулярные выражения, я думаю, вы можете сделать что-то вроде этого:

var index = 15;


var testString1 = "hi may name is Jone";
var testString2 = "hi sir may name is Jone";

testString1.match("^.{1," + index + "}Jone"); // This will match
testString2.match("^.{1," + index + "}Jone"); // This string is longer and will not match

Объяснение регулярного выражения ^.{1, n}Jone.

^: должно соответствовать началу строки.

.{1, n}Jone: сопоставляет все от 1 до n до тех пор, пока шаблон не будет полностью сопоставлен.

В этом случае мы определяем n как index, поэтому этот «предел» может быть динамическим.

Надеюсь, это поможет!

...