Соответствие регулярному выражению для начала нескольких слов в строке - PullRequest
11 голосов
/ 18 августа 2010

В Javascript я хочу иметь возможность сопоставлять строки, начинающиеся с определенной фразы.Однако я хочу, чтобы оно соответствовало началу любого слова в фразе, а не только началу фразы.

Например:

Фраза: «Это лучшее»

Необходимо сопоставить: "th"

Результат: Совпадает с Th и th

РЕДАКТИРОВАТЬ: \ b отлично работает, однако предлагает другую проблему:

Itтакже будет соответствовать символам после иностранных.Например, если моя строка "Männ", и я ищу "n", она будет соответствовать n после Mä ... Есть идеи?

Ответы [ 4 ]

23 голосов
/ 18 августа 2010
"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


Редактировать:

Итак, приведенное выше возвращает толькочасть, которую вы соответствуете (th).Если вы хотите вернуть все слова, вы должны соответствовать всему слову.

Вот тут-то все быстро и сложно.Сначала без буквы сущности HTML:

string.match(/\bth[^\b]*?\b/gi);

Пример

Чтобы соответствовать всему слову, перейдите от границы слова \b возьмитеth, за которыми следуют границы без слов [^\b], пока не дойдете до границы другого слова \b.Знак * означает, что вы хотите найти 0 или более из предыдущих (не ограничивающих слов) отметок ? означает, что это ленивое совпадение.Другими словами, он не расширяется до максимально возможного размера, но останавливается при первой возможности.

Если у вас есть символы сущностей HTML, такие как ä (ä), все усложняется очень быстро, и выдолжны использовать пробел или пробел и набор определенных символов, которые могут находиться на границах слов.

string.match(/\sth[^\s]*|^th[^\s]*/gi);

Пример с сущностями HTML.

Поскольку мы не используем границы слов, мы должны позаботиться о начале строки отдельно (|^).

Выше будет захватывать пробел в начале слова.Использование \b не будет захватывать пробелы, так как \b не имеет ширины.

1 голос
/ 18 августа 2010
var matches = "This is the best".match(/\bth/ig);

возвращает:

["Th", "th"]

Регулярное выражение означает: совпадать с «th» без учета регистра и глобально (то есть не останавливаться на одном совпадении), если «th» является первым словомв строке или если перед "th" стоит пробел.

1 голос
/ 18 августа 2010

Используйте флаг 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 словосочетанию слова. Обратите внимание, что он на самом деле не соответствует какому-либо определенному символу, но является началом или концом слова или строки.

1 голос
/ 18 августа 2010

Используйте это:

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"]

["й"]

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