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

фонарик 09.03.2013 18:10

Регулярные выражения
 
Пытался сам решить задачу и понял, что прежде я состарюсь чем пойму как оно работает используя метод тыка. Помогите с решением, пожалуйста.

Есть абзац с текстом, например такой:

[ "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;

Помогите пожалуйста.

Deff 09.03.2013 20:28

Цитата:

Сообщение от фонарик
Это кусок текста, перед которым и после еще много текста.

:) А какова уникальность этого текста, в отличии текста до и после?
Наличие Квадратных скобок ?

фонарик 09.03.2013 20:38

Вложений: 1
Цитата:

Сообщение от Deff (Сообщение 239684)
:) А какова уникальность этого текста, в отличии текста до и после?

Не знаю как ответить на вопрос, приложил файлик, откройте его блокнотом, он текстовый :)

Deff 09.03.2013 22:55

Цитата:

Сообщение от фонарик
приложил файлик, откройте его блокнотом, он текстовый

В выложенном коде нет переменной units

фонарик 10.03.2013 00:29

Переменной units в первом посте я присваивал значение "sarleon_recruit", это значение есть в файле что в архиве. Кусок текста что в первом посте как раз из этого файла что в архиве :-?

Deff 10.03.2013 01:26

Запутал... лан будем искать, по тому, что в топике

Deff 10.03.2013 14:34

<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>

фонарик 10.03.2013 16:21

Вот это да :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);
Пожалуйста, помогите наколдовать нужное, очень надеюсь что у вас манна еще не закончилась ))

Deff 10.03.2013 17:34

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));

фонарик 10.03.2013 17:43

Век жизни вам и здоровья, госодин Deff :) Большое спасибо


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