Использование jQuery для поиска подстроки

Скажем, у вас есть строка: «Корова ABC прыгнула через XYZ луну», и вы хотите использовать jQuery для получения подстроки между «ABC» и «XYZ». Как бы вы это сделали? Подстрока должна быть "корова перепрыгнула". Большое спасибо!


person Steve    schedule 12.06.2010    source источник
comment
Прежде всего, вы не используете jQuery для манипуляций со строками — это Javascript/ECMAScript. Во-вторых, можете ли вы более конкретно описать логику, используемую для захвата этой строки? Есть ли образец?   -  person meder omuraliev    schedule 12.06.2010
comment
Вопрос для jQuery без тега jQuery   -  person sushil bharwani    schedule 12.06.2010
comment
Ну вообще зачем нужен jQuery? не может простой javascript работать для вас   -  person sushil bharwani    schedule 12.06.2010
comment
На мой взгляд, этот вопрос не должен быть помечен jQuery по той причине, что он не имеет ничего общего с jQuery. ;)   -  person Gert Grenander    schedule 12.06.2010


Ответы (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 заменит в скобках подсовпадения из вашего обычного выражения - часть (.*) сверху. Таким образом, возвращаемое значение представляет собой замену всей строки частями между разделителями.

person meagar    schedule 12.06.2010
comment
Я думал, что у jQuery есть функции: substring и indexof, и что их можно использовать вместе для получения подстроки. - person Steve; 12.06.2010
comment
Не могли бы вы вкратце объяснить, как это работает: str.replace(/^.*ABC(.*)XYZ.*$/, '$1'); - person Steve; 12.06.2010
comment
@Steve - это JavaScript с такими функциями, как substring и indexof. jQuery в основном работает с DOM страницы. - person Gert Grenander; 12.06.2010
comment
Большое спасибо всем за помощь!! - person Steve; 12.06.2010
comment
Meagar, ваше объяснение великолепно, и ясно объясняет, кто это работает. Всего несколько второстепенных вопросов: 1. Требуется ли скобка () ТОЛЬКО как способ указать подсовпадение во втором параметре функции замены, или это также указывало бы на подсовпадения: /^.*ABC.*XYZ.*$ / но не сработало, что мы пытаемся сделать в этом случае? 2. Есть ли в этом регулярном выражении 7 подсовпадений: ^ .* ABC .* XYZ .* $ 3. Означает ли $1 использование первого подсовпадения в скобках? Сначала он подумал, что это может означать использование второго подсовпадения в серии (первое равно $0). Стив - person Steve; 13.06.2010
comment
@Steve Замена подсовпадения начинается с $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()< /а> функция. По моему опыту, эти типы функций работают одинаково во всех браузерах.

person dana    schedule 12.06.2010
comment
мне нравится этот, потому что я ненавижу регулярные выражения, интересно, хорошая ли это причина :) - person henrijs; 17.05.2011

Meagar, ваше объяснение великолепно, и ясно объясняет, кто это работает.

Всего несколько мелких вопросов:

  • Требуются ли скобки () ТОЛЬКО как способ указать частичное совпадение во втором параметре функции relpace, или это также идентифицирует частичные совпадения: /^.*ABC.XYZ.$/, но не работает для чего мы пытаемся сделать в этом случае?

  • Имеет ли это регулярное выражение 7 подсовпадений:

^
.*
ABC
.*
XYZ
.*
$

  • Означает ли $1 использование первого подсовпадения в скобках? Сначала я подумал, что это может означать использование второго подматча в серии (первый равен $0).

Спасибо,

Стив

person Steve    schedule 13.06.2010

Просто чтобы показать вам, как вы будете использовать 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. Я надеюсь, что это устраняет путаницу.

person Gert Grenander    schedule 12.06.2010