Регулярные выражения
Пытался сам решить задачу и понял, что прежде я состарюсь чем пойму как оно работает используя метод тыка. Помогите с решением, пожалуйста.
Есть абзац с текстом, например такой: [ "sarleon_recruit", "Sarleon Recruit", "Sarleon Recruits", tf_guarantee_boots|tf_guarantee_armor, 0, 0, fac_neutral, [ itm_ankle_boots, itm_leather_jacket, itm_linen_tunic, itm_leather_vest, itm_cudgel, itm_warhammer, itm_military_pick, itm_sickle, itm_dagger,], strength(15)|agility(5)|intellect(4)|charisma(14)| level(1), wp_one_handed(50)|wp_two_handed(50)|wp_polearm(50) |wp_archery(200)|wp_crossbow(20)|wp_throwing(2), knows_trade_12|knows_prisoner_management_1|knows_i nventory_management_2|knows_shield_10|knows_weapon _master_1|knows_power_throw_10|knows_ironflesh_1, 0x0000000000000001124000000020000000000000001c0080 0000000000000000, 0x00000000000062c76ddcdf7feefbffff00000000001efdbc 0000000000000000, 0, 52 ] Это кусок текста, перед которым и после еще много текста. Из этого абзаца необходимо в переменные присвоить значения. var units = "sarleon_recruit" 1) нужно найти в тексте переменную units, затем получить строковые значения что идут до закрывающейся квадратной скобки "]". Т.е это "itm_ankle_boots" "itm_leather_jacket" "itm_linen_tunic" и так далее. Эти значения всегда начинаются с "itm_". Поиск заканчивается при нахождении символа "]" Получиться должно, наверное, что-то вроде: itm_01="itm_ankle_boots" itm_02="itm_leather_jacket" и так далее. 2) нужно найти переменную "units" затем найти слово "strenght" и получить значение что в скобках(15); по аналогии, думаю, я сам смогу додумать и найти другие значения 3) нужно найти переменную "units" затем нужно найти строковые значения переменных что начинаются с "knows_", например "knows_trade_12" "knows_prisoner_management_1" "knows_inventory_management_2". Поиск нужно производить до символов "0x0". В принципе, этот поиск похож на 1 вариант, но я боюсь не найду сам где и что нужно поменять, чтобы искалось то, что нужно. В идеале, получиться должно что-то вроде var sarleon_recruit_knows_trade = 12; var sarleon_recruit_knows_prisoner_management = 1; Помогите пожалуйста. |
Цитата:
Наличие Квадратных скобок ? |
Вложений: 1
Цитата:
|
Цитата:
|
Переменной units в первом посте я присваивал значение "sarleon_recruit", это значение есть в файле что в архиве. Кусок текста что в первом посте как раз из этого файла что в архиве :-?
|
Запутал... лан будем искать, по тому, что в топике
|
<div id="Text"> sdffffffffffffffff [ "sarleon_recruit", "Sarleon Recruit", "Sarleon Recruits", tf_guarantee_boots|tf_guarantee_armor, 0, 0, fac_neutral, [ itm_ankle_boots, itm_leather_jacket, itm_linen_tunic, itm_leather_vest, itm_cudgel, itm_warhammer, itm_military_pick, itm_sickle, itm_dagger,], strength(15)|agility(5)|intellect(4)|charisma(14)| level(1), wp_one_handed(50)|wp_two_handed(50)|wp_polearm(50) |wp_archery(200)|wp_crossbow(20)|wp_throwing(2), knows_trade_12|knows_prisoner_management_1|knows_i nventory_management_2|knows_shield_10|knows_weapon _master_1|knows_power_throw_10|knows_ironflesh_1, 0x0000000000000001124000000020000000000000001c0080 0000000000000000, 0x00000000000062c76ddcdf7feefbffff00000000001efdbc 0000000000000000, 0, 52 ]sdfffffdsffffffffffff </div> <script> var str = document.getElementById('Text').innerHTML; //Это строка - аналог получения нужной строки var arr2=str.split(/[\s\S]*?((?:"sarleon_recruit")[\s\S]*?\])/img)[1].split(/\[|\]/img)[1].split(",");arr2.pop(); alert(arr2); //Массив в квадратных скобках за "sarleon_recruit"; var arr3=str.split(/[\s\S]*?((?:"sarleon_recruit")[\s\S]*?(?=0x000))/img)[1].split(/(strength)/img);arr3.splice(0,1); arr3 = arr3.join('').split(/knows_/)[0].split(/[,|]/img);arr3.pop(); alert(arr3); //Массив от strength до "knows_"; var arr4=str.split(/[\s\S]*?((?:"sarleon_recruit")[\s\S]*?(?=0x000))/img)[1].split(/(knows_.*?)[|,]/img);arr4.splice(0,1); arr4=arr4.join(',').split(/,+/img);arr4.pop(); alert(arr4) //Массив с "knows_"; </script> |
Вот это да :blink: Мистер Deff, не знаю я что вы принимаете для решения таких задач, но ведь все правильно, все работает :-? С такими способностями, вы наверно миллионер уже давно :D Спасибо вам огромное, благодарности нет границ :)
Вычленить из массивов нужные значения я сумею, остается лишь из этого значения, например, strenght(15) или agility(5) , достать значения из скобок. Полагаю, начинается оно так: var AttStr = "strenght(15)" // или arr3[0] из примера var arr=AttStr.split(а тут заклинание); alert(arr);Подскажите, пожалуйста, заклинание :) Правда, понадобится еще и из массива с "knows_" достать последие цифровые значения. Мне кажется, этот вариант не похож будет на предыдущий. var AttStr2 = "knows_trade_12" // или arr4[0] из примера var arr2=AttStr2.split(а тут заклинание); alert(arr);Пожалуйста, помогите наколдовать нужное, очень надеюсь что у вас манна еще не закончилась )) |
function retNumb(a){ var Numb = +a.replace(/[^\d]*(\d+)[^\d]*$/,'$1'); return Numb; } var AttStr = "strenght(15)" var AttStr2 = "knows_trade_12" // alert(retNumb(AttStr)); alert(retNumb(AttStr2)); |
Век жизни вам и здоровья, госодин Deff :) Большое спасибо
![]() |
Никак не получается вставить переменную в ваше заклинание, присвоил переменной BUM значение "sarleon_recruit", которое проходило свидетелем в вашем заклинании, и вставил переменную вместо "sarleon_recruit", но так почему-то не работает:
<script> var BUM = "sarleon_recruit" var str = document.getElementById('Text').innerHTML; //Это строка - аналог получения нужной строки var arr2=str.split(/[\s\S]*?((?:BUM)[\s\S]*?\])/img)[1].split(/\[|\]/img)[1].split(",");arr2.pop(); alert(arr2); //Массив в квадратных скобках за "sarleon_recruit"; var arr3=str.split(/[\s\S]*?((?:BUM)[\s\S]*?(?=0x000))/img)[1].split(/(strength)/img);arr3.splice(0,1); arr3 = arr3.join('').split(/knows_/)[0].split(/[,|]/img);arr3.pop(); alert(arr3); //Массив от strength до "knows_"; var arr4=str.split(/[\s\S]*?((?:BUM)[\s\S]*?(?=0x000))/img)[1].split(/(knows_.*?)[|,]/img);arr4.splice(0,1); arr4=arr4.join(',').split(/,+/img);arr4.pop(); alert(arr4) //Массив с "knows_"; </script>Пробовал и в кавычках ставить, и переменную делать маленькими букавками. Может переменную нужно как-то по особому вставлять в ваши египетские надписи? :D |
фонарик,
Где у Вас полная исходная строка ? вот её вставляете вместо document.getElementById('Text').innerHTML; //Это строка - аналог полученной нужной строки |
Цитата:
|
Ага - разбежались...
Нун сразу было говорить и приводить примеры с несколькими поисками, - Сейчас нет смысла в данной переменной, Кусок парсицо строго под "sarleon_recruit" - и для другой строки не сработает, посколь нун искать общую закономерность для любой такой строки при парсе текста Поясню - Вы уверены что для любой другой переменной, arr2 - будет стоять cледом за за ней в квадратных скобках ? И второе - выделите нужные переменные(для BUM) красным в исходном тексте |
Структура везде одинаковая, относительно конечно. Есть например переменная BUM со значением, пусть это будет все тот же "sarleon_recruit". Это значение уникальное и нигде больше не повторяется. Перед этим значением будет пробел и квадратная скобка:
[ "sarleon_recruit" - т.е это стандартное начало абзаца. Далее за этим началом через запятую идет разное количество переменных, строка заканчивается запятой, затем новая строка и там будут переменные itm_ они все в квадратных скобках. Т.е будет так: [ "sarleon_recruit", переменная, переменная цифра значение и тп, [itm_ankle_boots, itm_leather_jacket, и так далее] затем будет новая строка со значениями всегда определенного количества и названия переменных, которые закончатся запятой: "strength(15)|agility(5)|intellect(4)|charisma(14) | level(1), wp_one_handed(50)|wp_two_handed(50)|wp_polearm(50) |wp_archery(200)|wp_crossbow(20)|wp_throwing(2)", а после последней переменной wp_throwing идут переменные knows_ разного количества и заканчиваются на 0x00, получается всё в итоге так: [ "sarleon_recruit", переменная, переменная цифра значение и тп, [itm_ankle_boots, itm_leather_jacket, и так далее], strength(15)|agility(5)|intellect(4)|charisma(14)| level(1), wp_one_handed(50)|wp_two_handed(50)|wp_polearm(50) |wp_archery(200)|wp_crossbow(20)|wp_throwing(2), knows_trade_12|knows_prisoner_management_1|knows_i nventory_management_2|knows_shield_10|knows_weapon _master_1 и так далее, 0x00 Числовые значения всегда разные от 1 до 3х порядков; Первый массив должен содержать переменные itm_ второй - начинается с переменной strength, заканчиваясь перед переменными knows_ третий - переменные knows_ Прошу прощения что не сообщил о разности поиска, я думал разницы не будет, что "sarleon_recruit" что "Дядя_вася". Получается, что в переменную BUM будут присваиваться строковые значения, разные. Например "adventurer" или "military_horse_bowman". Не знаю ответил ли я на ваш вопрос, если бы я понимал хотябы общий принцип как вы это делаете, возможно не получилось бы так, что потребуются какие-то доработки :-? |
<div id="Text"> sdffffffffffffffff [ "sarleon_recruit", "Sarleon Recruit", "Sarleon Recruits", tf_guarantee_boots|tf_guarantee_armor, 0, 0, fac_neutral, [ itm_ankle_boots, itm_leather_jacket, itm_linen_tunic, itm_leather_vest, itm_cudgel, itm_warhammer, itm_military_pick, itm_sickle, itm_dagger,], strength(15)|agility(5)|intellect(4)|charisma(14)| level(1), wp_one_handed(50)|wp_two_handed(50)|wp_polearm(50) |wp_archery(200)|wp_crossbow(20)|wp_throwing(2), knows_trade_12|knows_prisoner_management_1|knows_i nventory_management_2|knows_shield_10|knows_weapon _master_1|knows_power_throw_10|knows_ironflesh_1, 0x0000000000000001124000000020000000000000001c0080 0000000000000000, 0x00000000000062c76ddcdf7feefbffff00000000001efdbc 0000000000000000, 0, 52 ]sdfffffdsffffffffffff </div> <script> function arraysFind (BUM) { var Out =[]; var str = document.getElementById('Text').innerHTML; //Это строка - аналог получения нужной строки var valid = str.indexOf(BUM); if(valid==-1) return false; str = str.substring(valid);//alert('>'+str) var arr1=str.split(/\[|\]/img)[1].split(",");arr1.pop(); Out.push(arr1);//Массив в квадратных скобках за BUM; var arr2=str.split(/0x000/img)[0].split(/(strength)/img);arr2.splice(0,1); arr2 = arr2.join('').split(/knows_/)[0].split(/[,|]/img);arr2.pop(); Out.push(arr2); //Массив от strength до "knows_"; var arr3=str.split(/0x000/img)[0].split(/(knows_.*?)[|,]/img);arr3.splice(0,1); arr3=arr3.join(',').split(/,+/img);arr3.pop(); Out.push(arr3); //Массив с "knows_"; return Out; } var BUM = "sarleon_recruit"; var OutArr = arraysFind (BUM); alert(OutArr[0]) alert(OutArr[1]) alert(OutArr[2]) </script> |
Мистер Deff, если случится великий потоп, вас спасать нужно будет обязательно :) Всё работает, всё проверил, всё правильно и лучше не придумать. Спасибо вам за добрые дела, ваши знания и опыт очень помогли мне, как хорошо что на этом форуме есть Вы
![]() |
фонарик,
Перебор с благозвучием... минус в карму |
Репка сморщилась от натугов, но никак не получается :( Ваш скрипт работает каким-то хитрым образом вдобавок. Переменную BUM которая обозначается в скрипте, никак обновить не получается, функцию вызвать по событию повторно (т.е после загрузки страницы), тоже не получается. Подскажите, как на данном примере сделать так, чтобы при клике на синий блок или на зеленый, в переменную BUM присваивалось значение id из-под нажатого элемента и производился соответствующий поиск ?
http://learn.javascript.ru/play/rftSF |
фонарик,
:-? onmousedown="alert(arraysFind(this.id))" |
фонарик,
Наверняка - onclick="alert(arraysFind(this.id))" -корректнее, поскольку пользователь нажав - еще раздумывает, а вот нажав отпустив - ожидает действия |
Вот вы привели пример с alert, и представить себе не можете сколько часов я думал и пытался сделать так, чтобы alert работал непосредственно из функции arraysFind :-? Но все-таки, не смотря на то, что смотреть на ваш скрипт изнутри было страшновато, проблему решил :) Оказалось, что там alert вне тела самой функции, потому и не работало :D Большое вам спасибо за подсказку.
|
Никак не могу понять, почему нельзя определить размер массива :( Приписываю к массиву .lenght, но не работает. Подскажите пожалуйста, как в вашем скрипте определить размер массива?
http://learn.javascript.ru/play/0mZIH (строка 43) |
фонарик, массив Out , а arr - его элементы
alert(Out.length) |
рони, похоже на то :) Получается тогда что-то вроде:
alert(Out[0].length)Спасибо за подсказку :) |
Мистер Deff, а нельзя ли облачить каждый элемент во всех трех массивах в кавычки? Дело в том, что полученные массивы текстом вставляются в другой скрипт, и я с удивлением обнаружил что название элемента в массиве должно быть написано обязательно в кавычках :( Такое возможно в вашем скрипте, если обойтись без сильных изменений всего скрипта в целом? :-?
<div id="Text" style="display:none; "> [ "sarleon_recruit", "Sarleon Recruit", "Sarleon Recruits", tf_guarantee_boots|tf_guarantee_armor, 0, 0, fac_neutral, [ itm_ankle_boots, itm_leather_jacket, itm_linen_tunic, itm_leather_vest, itm_cudgel, itm_warhammer, itm_military_pick, itm_sickle, itm_dagger,], strength(5)|agility(5)|intellect(4)|charisma(4)|level(1), wp_one_handed(50)|wp_two_handed(50)|wp_polearm(50)|wp_archery(20)|wp_crossbow(20)|wp_throwing(20), knows_trade_2|knows_prisoner_management_1|knows_inventory_management_2|knows_shield_1|knows_weapon_master_1|knows_power_throw_1|knows_ironflesh_1, 0x0000000000000001124000000020000000000000001c00800000000000000000, 0x00000000000062c76ddcdf7feefbffff00000000001efdbc0000000000000000, 0, 52 ] </div> <div id="sarleon_recruit" onclick="arraysFind(this.id)" style="cursor:pointer;border:1px solid red; width:30px; height:30px; position:absolute; left: 40px; top: 20px; z-index:555; background-color:blue;"></div> <script> function arraysFind (BUM) { var Out =[]; var str = document.getElementById('Text').innerHTML; //Это строка - аналог получения нужной строки var valid = str.indexOf(BUM); if(valid==-1) return false; str = str.substring(valid);//alert('>'+str) var arr1=str.split(/\[|\]/img)[1].split(",");arr1.pop(); Out.push(arr1);//Массив в квадратных скобках за BUM; var arr2=str.split(/0x000/img)[0].split(/(strength)/img);arr2.splice(0,1); arr2 = arr2.join('').split(/knows_/)[0].split(/[,|]/img);arr2.pop(); Out.push(arr2); //Массив от strength до "knows_"; var arr3=str.split(/0x000/img)[0].split(/(knows_.*?)[|,]/img);arr3.splice(0,1); arr3=arr3.join(',').split(/,+/img);arr3.pop(); Out.push(arr3); //Массив с "knows_"; alert(arr1) alert(arr2) alert(arr3) return Out; } </script> |
<div id="Text" style="display:none; "> [ "sarleon_recruit", "Sarleon Recruit", "Sarleon Recruits", tf_guarantee_boots|tf_guarantee_armor, 0, 0, fac_neutral, [ itm_ankle_boots, itm_leather_jacket, itm_linen_tunic, itm_leather_vest, itm_cudgel, itm_warhammer, itm_military_pick, itm_sickle, itm_dagger,], strength(5)|agility(5)|intellect(4)|charisma(4)|level(1), wp_one_handed(50)|wp_two_handed(50)|wp_polearm(50)|wp_archery(20)|wp_crossbow(20)|wp_throwing(20), knows_trade_2|knows_prisoner_management_1|knows_inventory_management_2|knows_shield_1|knows_weapon_master_1|knows_power_throw_1|knows_ironflesh_1, 0x0000000000000001124000000020000000000000001c00800000000000000000, 0x00000000000062c76ddcdf7feefbffff00000000001efdbc0000000000000000, 0, 52 ] </div> <div id="sarleon_recruit" onclick="arraysFind(this.id)" style="cursor:pointer;border:1px solid red; width:30px; height:30px; position:absolute; left: 40px; top: 20px; z-index:555; background-color:blue;"></div> <script> function arraysFind (BUM) { function replac (arr) { arr=arr.join(',').replace(/^\s*|\s*$/,'').split(/\s*?,\s*/g); arr=('"'+arr.join('","')+'"').split(/,/g); return arr } var Out =[]; var str = document.getElementById('Text').innerHTML; //Это строка - аналог получения нужной строки var valid = str.indexOf(BUM); if(valid==-1) return false; str = str.substring(valid);//alert('>'+str) var arr1=str.split(/\[|\]/img)[1].split(",");arr1.pop(); arr1 = replac(arr1); Out.push(arr1);//Массив в квадратных скобках за BUM; var arr2=str.split(/0x000/img)[0].split(/(strength)/img);arr2.splice(0,1); arr2 = arr2.join('').split(/knows_/)[0].split(/[,|]/img);arr2.pop(); arr2 = replac(arr2); Out.push(arr2); //Массив от strength до "knows_"; var arr3=str.split(/0x000/img)[0].split(/(knows_.*?)[|,]/img);arr3.splice(0,1); arr3=arr3.join(',').split(/,+/img);arr3.pop(); arr3 = replac(arr3); Out.push(arr3); //Массив с "knows_"; alert(arr1) alert(arr2) alert(arr3) return Out; } </script> |
Большое вам спасибо :)
В переменных itm_ перед названием, т.е после кавычки стоит пробел Код:
" itm_ankle_boots"," itm_leather_jacket"," itm_linen_tunic", |
Цитата:
В исходнике строки [ itm_ankle_boots, itm_leather_jacket, itm_linen_tunic, itm_leather_vest, itm_cudgel, itm_warh |
Проверил на своих кракозябрах, все правильно обрабатывается, все как нужно. Чтоб я без вас делал :D Спасибо.
|
Часовой пояс GMT +3, время: 01:45. |