Регулярное выражение для сопоставления всей или начальной части строки в JavaScript

#javascript #regex

#javascript #регулярное выражение #строка

Вопрос:

Я пытаюсь найти регулярное выражение, которое будет соответствовать приведенным ниже критериям.

Моя строка для сопоставления

  var txt = "This is Regex";
 

Пользователь может ввести что-нибудь вроде приведенного ниже

  1. «Это» — допустимо
  2. «Th» — допустимый
  3. «Это» —допустимо
  4. «Это Reg» — допустимо
  5. «Это регулярное выражение» — допустимо
  6. «Tis» — недопустимо
  7. «является» — недопустимым
  8. «Reg» — недопустимый

Таким образом, пользователь может ввести часть текста или полный текст. Если пользователь вводит часть текста, он должен проверять последовательность, и если он не соответствует txt последовательности, то он недействителен.

Я ищу решение с использованием jQuery, но даже простой JavaScript также подходит.

Просто чтобы уточнить мое требование, я привел выше 7 пунктов, это не значит, что только пользователь может вводить выше 7 (например: — Если пользователь вводит «T», то оно является допустимым, поскольку оно является первым символом, и если пользователь вводит только «H», оно недействительно, поскольку оно не требуется»T»

Комментарии:

1. jQuery не имеет ничего общего с регулярным выражением.

Ответ №1:

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

 function isMatch(userTxt) {
    return txt.indexOf(userTxt) != -1;
}
 

(Если пользовательский текст не существует в строке, то вызов indexOf вернет -1, поскольку подстрока не существует в строке.)

Если строка, которую вводит пользователь, должна начинаться с начала txt , вы могли бы более явно проверить, равен ли возвращаемый индекс ровно 0:

 function isMatch(userTxt) {
    return txt.indexOf(userTxt) == 0;
}
 

Комментарии:

1. Рассмотрим userTxt = «Это регулярное выражение»

2. @sahbeewah — что насчет этого?

3. Оно должно возвращать недопустимый результат, в то время как ваше решение будет возвращать действительный результат.

4. @sahbeewah — Вы пробовали его запускать? Мое решение возвращает false , если я передал, "This is Regexa" поскольку оно не является подстрокой txt .

Ответ №2:

Похоже, что вы ищете txt.substring(0, subtxt.length) === subtxt . Другими словами, соответствует ли строка поиска subtxt началу txt строки.

 function match(txt, subtxt) {
    return txt.substring(0, subtxt.length) === subtxt;
}
 

Тест

 > txt = "This is Regex";
> ["This", "Th", "This is", "This is Reg", "This is Regex", "Tis", "is",   "Reg"]
    .forEach(function(sub) { 
        console.log('"' sub '"', "--", match(txt, sub) ? "Valid" : "InValid"); 
  })

"This" -- Valid
"Th" -- Valid
"This is" -- Valid
"This is Reg" -- Valid
"This is Regex" -- Valid
"Tis" -- InValid
"is" -- InValid
"Reg" -- InValid 
 

ES6’s startsWith

В ES6 вы могли бы использовать метод new String#StartsWith .

В полизаполнении, приведенном на странице выше, они предлагают использовать indexOf , как в

 function match(txt, subtxt) {
    return !txt.indexOf(subtxt);
}
 

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

Но я действительно хотел регулярное выражение

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

 var regexp = /^T(h(i(s( (i(s( (R(e(g(e(x)?)?)?)?)?)?)?)?)?)?)?)?$/
 

Это регулярное выражение может быть «прочитано вслух» как

Оно начинается с буквы «T», за которой следует либо ничего, либо «h», за которым следует либо ничего, либо «i», за которым следует либо ничего, либо «s», за которым следует …. «.

Вы поняли идею.

 function match1(subtxt) {
    return regexp.test(subtxt);
}
 

Тест

 > ["This", "Th", "This is", "This is Reg", "This is Regex", "Tis", "is",   "Reg"]
    .forEach(function(sub) { 
        console.log('"' sub '"', "--", match1(sub) ? "Valid" : "InValid");  
  })

"This" -- Valid
"Th" -- Valid
"This is" -- Valid
"This is Reg" -- Valid
"This is Regex" -- Valid
"Tis" -- InValid
"is" -- InValid
"Reg" -- InValid 
 

Создание регулярного выражения программно

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

 function make_regexp(str) {

    function _make_regexp(str) {
        return str amp;amp; str[0]   "("   _make_regexp(str.slice(1))   ")?";
    }

    return RegExp("^"   _make_regexp(str)   "$");
}

> make_regexp("This is Regex")
/^T(h(i(s( (i(s( (R(e(g(e(x()?)?)?)?)?)?)?)?)?)?)?)?)?$/
 

Комментарии:

1. Версия RegExp не привязывает выражение к началу строки.

2. Кроме того, функция make_regexp была бы намного эффективнее без рекурсии. Рассмотрите возможность использования split и join: return str.split('').join('(') (new Array(str.length).join(')?'));

3. @torazaburo: но это совпадение также с «T» и другой комбинацией

4. @walidtoumi Какой другой комбинации оно соответствует?

5. @torazaburo: это соответствует: Thi This i This is R This is Re

Ответ №3:

Попробуйте с этим

  ^Th(?:is is Reg(?:ex)?|is(?: is)?)?$