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

В 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 слова. Обратите внимание, что это действительно не соответствует определенному символу, но начало или конец слова или строки.