Скажем, у вас есть строка: «Корова ABC прыгнула через XYZ луну», и вы хотите использовать jQuery для получения подстроки между «ABC» и «XYZ». Как бы вы это сделали? Подстрока должна быть "корова перепрыгнула". Большое спасибо!
Использование jQuery для поиска подстроки
Ответы (4)
Это не имеет ничего общего с jQuery, который в первую очередь предназначен для обхода и манипулирования DOM. Вам нужно простое регулярное выражение:
var str = "The ABC cow jumped over XYZ the moon";
var sub = str.replace(/^.*ABC(.*)XYZ.*$/m, '$1');
Идея заключается в том, что вы используете String.replace с регулярное выражение, которое соответствует вашим открывающим и закрывающим разделителям и заменяет всю строку частью, совпавшей между разделителями.
Первый аргумент является регулярным выражением. Завершающий m
приводит к тому, что он соответствует нескольким строкам, а это означает, что ваш текст между ABC
и XYZ
может содержать символы новой строки. Остальное распределяется следующим образом:
^
начать с начала строки.*
серия из 0 или более символовABC
ваш начальный разделитель(.*)
соответствует серии из 0 или более символовXYZ
ваш закрывающий разделитель.*
серия из 0 или более символов$
соответствует концу строки
Второй параметр, заменяющая строка, равен '$1'. replace
заменит в скобках подсовпадения из вашего обычного выражения - часть (.*)
сверху. Таким образом, возвращаемое значение представляет собой замену всей строки частями между разделителями.
$1
, а не $0
, и рассматриваемые подсовпадения должны быть заключены в круглые скобки, чтобы обозначить их как таковые. /^.*ABC.*XYZ.*$/
по-прежнему будет соответствовать всей строке, но именно (.*)
делает его полезным, позволяя нам извлекать символы, соответствующие параметру замены $1
.
- person meagar; 14.06.2010
Возможно, вам не нужно использовать jQuery для этого. Я бы сделал что-то вроде этого:
function between(str, left, right) {
if( !str || !left || !right ) return null;
var left_loc = str.indexOf(left);
var right_loc = str.indexOf(right);
if( left_loc == -1 || right_loc == -1 ) return null;
return str.substring(left_loc + left.length, right_loc);
}
Нет гарантий, что приведенный выше код не содержит ошибок, но идея состоит в том, чтобы использовать стандартную substring()< /а> функция. По моему опыту, эти типы функций работают одинаково во всех браузерах.
Meagar, ваше объяснение великолепно, и ясно объясняет, кто это работает.
Всего несколько мелких вопросов:
Требуются ли скобки () ТОЛЬКО как способ указать частичное совпадение во втором параметре функции relpace, или это также идентифицирует частичные совпадения: /^.*ABC.XYZ.$/, но не работает для чего мы пытаемся сделать в этом случае?
Имеет ли это регулярное выражение 7 подсовпадений:
^
.*
ABC
.*
XYZ
.*
$
- Означает ли $1 использование первого подсовпадения в скобках? Сначала я подумал, что это может означать использование второго подматча в серии (первый равен $0).
Спасибо,
Стив
Просто чтобы показать вам, как вы будете использовать jQuery и регулярное выражение Мигара. Допустим, у вас есть HTML-страница со следующим тегом P
:
<p id="grabthis">The ABC cow jumped over XYZ the moon</p>
Чтобы получить строку, вы должны использовать следующую смесь jQuery/JavaScript (звучит глупо, поскольку jQuery — это JavaScript, но рассматривайте jQuery как библиотеку DOM JavaScript):
$(document).ready(function() { // Wait until the document has been fully loaded
var pStr=$("#grabthis").text(); // Grab the text from the P tag and put it into a JS variable
var subStr=pStr.replace(/^.*ABC(.*)XYZ.*$/m, '$1'); // Run the regex to grab the middle string
alert(subStr); // Output the grabbed middle string
});
Или более короткая версия:
$(document).ready(function() {
alert($("#grabthis").text().replace(/^.*ABC(.*)XYZ.*$/m, '$1'));
});
Функция замены — это функция JavaScript. Я надеюсь, что это устраняет путаницу.