Используйте регулярное выражение или разделить, чтобы найти конкретную строку - PullRequest
0 голосов
/ 28 июля 2011

У меня есть следующая строка: 'user-status status-avail left top-pos'.
Я хотел бы найти эту строку в поиске «состояние-что-то», где что-то может иметь различные формы, такие как «занято», «not_busy» и вернуть эту конкретную строку. Как мне написать свое регулярное выражение и использовать ли мне split или match для этой задачи?

Я пробовал:

str.match(/status-([a-z]+)/);

но я получаю:

["status-avail", "avail"] взамен, а не только «статус-доступ».

Ответы [ 3 ]

1 голос
/ 28 июля 2011

String.match () имеет два режима работы

Строковый метод match() можно использовать двумя способами, и важно понимать, что он возвращает. Если вы установите флаг 'g' global , то метод возвращает массив всех совпадений в строке, и каждый элемент массива содержит одно полное совпадение регулярного выражения. Но если вы НЕ устанавливаете флаг 'g' global , то метод ищет только первое совпадение в строке и возвращает массив, содержащий подробную информацию об этом совпадении. В этом случае первый элемент (matches[0]) содержит общее совпадение, а последующие элементы содержат содержимое групп захвата в регулярном выражении (т.е. matches[1] содержит содержимое группы захвата 1, matches[2] содержит содержимое захвата группа 2 и т. д.).

Регулярное выражение в исходном сообщении: (/status-([a-z]+)/) не имеет установленного глобального флага 'g', поэтому оно возвращает подробную информацию о первом совпадении. А поскольку существует одна группа захвата, возвращаемый массив имеет два элемента, первый элемент имеет полное совпадение, а второй - содержимое первой и единственной группы захвата.

Если вы добавите глобальный флаг, вы получите массив всех совпадений в строке:

str.match(/status-([a-z]+)/g);

Или (как отмечали другие авторы) вы можете удалить захватывающие скобки из регулярного выражения, и в этом случае вызов метода match() вернет массив, содержащий только один элемент, который является общим совпадением:

str.match(/status-[a-z]+/);

String.match() очень полезно, когда вы понимаете это поведение.

0 голосов
/ 28 июля 2011
var matches=str.match(/status-[_a-zA-Z]+/);
if(matches[0])
     var statusSubstr=matches[0];

Попробуй это. something от вашего оригинального сообщения с таким RegExp может содержать буквы (с пропущенными регистрами) и '_'. statusSubStr будет содержать то, что вы хотите. Если str=user-status status-avail left top-pos, то statusSubStr=status-avail. Я надеюсь, что это полезно.

0 голосов
/ 28 июля 2011

Удалите скобки из вашего регулярного выражения. (или просто получите первый найденный предмет)

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