Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярные выражения вытаскивание по шаблону (https://javascript.ru/forum/misc/1936-regulyarnye-vyrazheniya-vytaskivanie-po-shablonu.html)

baal1988 07.10.2008 17:57

Регулярные выражения вытаскивание по шаблону
 
Имеется строка к примеру вот такая
var str = "Number of tube((13 Hi all people * _ +)) Number of tube((HI AKK))";

1. Необходимо вытащить данные которые содержаться в круглых двойных скобках
2. Почему если в шаблоне содержится кириллица то при нахождении результата по шаблону вылазят какие-то кракозябры а не русские буквы ? Это не применительно к этому примеру а вообще ? Сильно не пинайте, только начал изучение регулярных выражений ...
Я делаю вот так но не получается
var reg = /Number of tube\(*(.*)\)*/;
var str = "Number of tube((13 Hi all people * _ +)) Number of tube((HI AKK))";
var arr=reg.exec(str);
document.write(arr);

ZoNT 07.10.2008 18:38

var reg = /\(+(.*?)\)+/g;
var str = "Number of tube((13 Hi all people * _ +)) Number of tube((HI AKK))";
var arr=str.match(reg);
alert(arr);


только потом сделать реплейс каждому элементу (убрать скобки)...

Андрей Параничев 07.10.2008 18:52

var str = "Number of tube((13 Hi all people * _ +)) Number of tube((HI AKK))";
alert(str.match(/([^\(\)]+)(?=\)+)/g));

Для нескольких результатов используйте match и флаг "g". Кстати, на сайте есть хорошая статья про регулярные выражения.

baal1988 07.10.2008 19:28

Хорошо спасибо , а если мне важно знать вернее необходимо знать что находится перед двойными скобками ? Например в примере "Number of tube?" если строка например вида
var str = "Number of tube((13 Hi all people * _ +)) Number of tube((HI AKK)) Number of city((HI DEEP))";

И мне требуется найти то что находится между двойными скобками + перед двойными скобками должно стоять выражение Number of tube
а по поводу второго вопроса могли бы помочь чем-нибудь ? Про проблему в кодировке ?

jsch 08.10.2008 09:44

ответ
 
var str = "Number of tube((13 Hi all people * _ +)) Number of tube((HI AKK)) Number of city((HI DEEP))";
alert(str.match(/Number of tube([^\(\)]+)(?=\)+)/g));

по поводу кодировки:
проставлена ли кодировка на весь документ?

jsch 08.10.2008 09:46

ответ
 
хотелось бы взглянуть на содержимое, HTML+JS(если отдельно)

ZoNT 08.10.2008 11:21

var str = "Number of tube13 Hi all people * _ +)) Number of tubeHI AKK))";
alert(str.match(/([^\(\)]+)(?=\)+)/g));

результат: Number of tube13 Hi all people * _ +,Number of tubeHI AKK

baal1988 08.10.2008 12:15

Цитата:

Сообщение от ZoNT (Сообщение 6843)
var str = "Number of tube13 Hi all people * _ +)) Number of tubeHI AKK))";
alert(str.match(/([^\(\)]+)(?=\)+)/g));

результат: Number of tube13 Hi all people * _ +,Number of tubeHI AKK

Да результат именно такой , но ваша строка str не содержит после слов Number of tube двойные закрывающие скобки поэтому результат именно такой .....

baal1988 08.10.2008 12:19

Цитата:

Сообщение от jsch (Сообщение 6839)
var str = "Number of tube((13 Hi all people * _ +)) Number of tube((HI AKK)) Number of city((HI DEEP))";
alert(str.match(/Number of tube([^\(\)]+)(?=\)+)/g));

по поводу кодировки:
проставлена ли кодировка на весь документ?

Результат null, не работает

ZoNT 08.10.2008 12:51

var str = "1) Number of tube13(( Hi all people * _ +)) Number of tube((HI AKK))";
alert(str.match(/([^\(\)]+)(?=\)+)/g));


Результат - неверный :)

baal1988 08.10.2008 13:06

Цитата:

Сообщение от ZoNT (Сообщение 6852)
var str = "1) Number of tube13(( Hi all people * _ +)) Number of tube((HI AKK))";
alert(str.match(/([^\(\)]+)(?=\)+)/g));


Результат - неверный :)

Ну да :)

baal1988 08.10.2008 13:43

Сделал вот так
var reg = /Number of tube\(+([^\(\)]+)\)+/g;
var str = "1) Number of tube((13 Hi all people * _ +)) Number of tube((HI AKK)) Number of Kills ((Privet)) Number of tube((HI HOUSE))";
var arr=str.match(reg);
alert(arr);

Не могу понять почему резульатом служит Number of tube((13 Hi all people * _ +)),Number of tube((HI AKK)),Number of tube((HI HOUSE))
Ведь в круглых скобках стоит запомнить только то что находится в скобках ? Хочется чтобы результатом было - 13 Hi all people * _ +,HI AKK,HI HOUSE

Snipe 08.10.2008 13:50

то что в скобках, вроде хранится в .$1, .$2 и т.д.

ZoNT 08.10.2008 13:56

var reg = /Number of tube\(+[^\)\(]+\)+/g;
var str = "1) Number of tube((13 Hi all people * _ +)) Number of tube((HI AKK)) Number of Kills ((Privet)) Number of tube((HI HOUSE))";
var arr=str.match(reg,'').join('').replace(/\)+/g,'').split(/Number of tube\(+/);
alert(arr);

Андрей Параничев 08.10.2008 14:25

Я написал код под конкретный заданный вопрос. Очевидно, что он будет работать, если условия менять.

baal1988 08.10.2008 15:30

Цитата:

Сообщение от ZoNT (Сообщение 6861)
var reg = /Number of tube\(+[^\)\(]+\)+/g;
var str = "1) Number of tube((13 Hi all people * _ +)) Number of tube((HI AKK)) Number of Kills ((Privet)) Number of tube((HI HOUSE))";
var arr=str.match(reg,'').join('').replace(/\)+/g,'').split(/Number of tube\(+/);
alert(arr);

А можно объяснить что здесь к чему вообще пожалуйста ? Разобраться хочется...

Я сделал вот так как первый раз говорили
var exam = "";
var reg = /Number of tube\(+([^\(\)]+)\)+/g;
var str = "1) Number of tube((13 Hi all people * _ +)) Number of tube((HI AKK)) Number of Kills ((Privet)) Number of tube((HI HOUSE))";
var arr = str.match(reg);
var mas = new Array();
for (var i=0; i<arr.length; i++) {
mas[i]=arr[i].replace("Number of tube", ""); mas[i]=mas[i].replace("))", ""); mas[i]=mas[i].replace("((", "");
}
alert(mas);


Ну у меня сразу же вопрос появился ? Как измениться код если будет существовать переменная exam которая будет меняться и содержать в себе слово Number of tube, как сделать чтобы шаблон реагировал на переменную как на переменную, а не просто слово какое-то ,например
var exam = "Number of tube";
var reg = "/" + exam + "\(+([^\(\)]+)\)+/g";

я просто синтаксис незнаю буду благодарен за помощь ...

ZoNT 08.10.2008 15:34

var reg = new RegExp(exam+'\\(+[^\\(\\)]+\\)+','g');

Андрей Параничев 08.10.2008 15:42

ZoNT,
А почему вот в этом случае:
(?:Number of tube\(+)([^\)]+)(?=\)+)

Первая non-capturing group все равно попадает в matches?

ZoNT 08.10.2008 15:45

потому что в match попадает вся подстрока из шаблона, а не выражение в скобках..

Андрей Параничев 08.10.2008 15:53

ZoNT,
Но (?=) работает ведь.

ZoNT 08.10.2008 15:56

почему (?= работает - вот в чём вопрос :)

ZoNT 08.10.2008 16:03

(?= работает только в конце...

Zeroglif 08.10.2008 23:18

Цитата:

Сообщение от baal1988
Хочется чтобы результатом было - 13 Hi all people * _ +,HI AKK,HI HOUSE

var s = '1) Number of tube((13 Hi all people * _ +)) Number of tube((HI AKK))',
    r = /Number of tube\(\((.*?)\)\)/g,
    a = [];
while (r.exec(s)) {
    a[a.length] = RegExp.$1;
}
alert(a);

jsch 09.10.2008 07:35

ответ
 
var word = "Number of tube";
var number_of_skobka = 2;
var str = "1) Number of tube((13 Hi all people * _ +)) Number of tube((HI AKK)) Number of Kills ((Privet)) Number of tube((HI HOUSE))";
var reg1 = new RegExp(word+"\\({"+number_of_skobka+"}[^\\)\\(]+(?=\\){"+number_of_skobka+"})","g");
var reg2 = new RegExp(word+"\\({"+number_of_skobka+"}");
alert(reg1.toString());
alert(reg2.toString());
var arr = str.match(reg1).join("").split(reg2);
alert(arr);

тока вот arr[0] будет всегда пустой

и еще может кто подскажет почему в js в регулярных выражениях просмотр назад не работает?
так бы можно было бы обойтись одной строкой
str.match(/(?<=Number of tube\({2})[^\(\)]+(?=\){2})/g)

jsch 09.10.2008 08:06

ответ
 
только что заметил: в IE у переменной arr нет первого пустого элемента

Kolyaj 09.10.2008 09:42

Цитата:

Сообщение от jsch
и еще может кто подскажет почему в js в регулярных выражениях просмотр назад не работает?

Если имеются в виду обратные ссылки, то они обозначаются $N.

Цитата:

Сообщение от jsch
только что заметил: в IE у переменной arr нет первого пустого элемента

Есть такая бага, если нужно все выражение приходится брать его в скобки.

jsch 09.10.2008 10:11

ответ
 
Цитата:

Сообщение от Kolyaj (Сообщение 6910)
Если имеются в виду обратные ссылки, то они обозначаются $N.

нее. выражение типа (?<=шаблон)

Kolyaj 09.10.2008 10:51

Цитата:

Сообщение от jsch
нее. выражение типа (?<=шаблон)

Ну эти много где не поддерживаются, а если поддерживаются, то только фиксированной длины. Если учитывать упомянутую багу ИЕ с нулевым элементом, то они особо и не нужны.


Часовой пояс GMT +3, время: 02:17.