Соответствие регулярных выражений для начала нескольких слов в строке
В Javascript я хочу иметь возможность сопоставлять строки, начинающиеся с определенной фразы. Тем не менее, я хочу, чтобы он мог сопоставить начало любого слова во фразе, а не только начало фразы.
Например:
Фраза: "Это лучший"
Необходимо совместить: "th"
Результат: Соответствует Th и th
EDIT:\b отлично работает, но предлагает другую проблему:
Он также будет соответствовать символам после иностранных. Например, если моя строка "Männ", и я ищу "n", она будет соответствовать n после Mä... Любые идеи?
Ответы
Ответ 1
"This is the best moth".match(/\bth/gi);
или с переменной для вашей строки
var string = "This is the best moth";
alert(string.match(/\bth/gi));
\b
в регулярном выражении является границей слов, поэтому \bth
будет соответствовать только th
, что в начале слова.
gi
для глобального соответствия (искать все вхождения) и нечувствительности к регистру
(я бросил там moth
в качестве напоминания, чтобы проверить, что он не сопоставлен)
Пример jsFiddle
Edit:
Итак, вышесказанное возвращает только ту часть, которую вы сопоставляете (th
). Если вы хотите вернуть все слова, вы должны соответствовать всему слову.
В этом случае ситуация становится сложной. Сначала без буквы сущности HTML:
string.match(/\bth[^\b]*?\b/gi);
Пример
Чтобы соответствовать всему слову, перейдите от границы слова \b
, возьмите th
, за которым следуют неслововые границы [^\b]
, пока вы не перейдете на другую границу слова \b
. *
означает, что вы хотите искать 0 или более из предыдущих (границы без слов), метка ?
означает, что это ленивое совпадение. Другими словами, он не расширяется настолько, насколько это возможно, но останавливается при первой возможности.
Если у вас есть символы сущности HTML, такие как & auml; (ä
) вещи становятся сложными очень быстро, и вы должны использовать пробелы или пробелы и набор определенных символов, которые могут быть на границах слов.
string.match(/\sth[^\s]*|^th[^\s]*/gi);
Пример с объектами HTML.
Поскольку мы не используем границы слов, мы должны позаботиться о начале строки отдельно (|^
).
Вышеупомянутое будет отображать пробел в начале слов. Использование \b
не будет фиксировать пробел, так как \b
не имеет ширины.
Ответ 2
Используйте это:
string.match(/^th|\sth/gi);
Примеры:
'is this is a string'.match(/^th|\sth/gi);
'the string: This is a string'.match(/^th|\sth/gi);
Результаты:
[ "th", "Th" ]
[ "й" ]
Ответ 3
var matches = "This is the best".match(/\bth/ig);
возвращает:
["Th", "th"]
Регулярное выражение означает: сопоставить "th" , игнорируя регистр и глобально (это означает, что не останавливайтесь только на одном совпадении), если "th" - это первое слово в строке, или если "th" предшествует символ пробела.
Ответ 4
Используйте флаг g
в регулярном выражении. Я думаю, что это означает "глобальный", и он ищет все совпадения, а не только первый.
Вы также должны использовать флаг i
для нечувствительности к регистру.
Вы добавляете флаги в конец регулярного выражения (/<regex>/<flags>
) или в качестве второго параметра new RegExp(pattern, flags)
Например:
var matches = "This is the best".match(/\bth/gi);
или, используя объекты RegExp
:
var re = new RegExp("\\bth", "gi");
var matches = re.exec("This is the best");
EDIT:
Используйте \b
в регулярном выражении для сопоставления с надписью b слова. Обратите внимание, что это действительно не соответствует определенному символу, но начало или конец слова или строки.