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 :) Большое спасибо

фонарик 10.03.2013 19:32

Никак не получается вставить переменную в ваше заклинание, присвоил переменной 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

Deff 10.03.2013 20:26

фонарик,
Где у Вас полная исходная строка ?
вот её вставляете вместо document.getElementById('Text').innerHTML; //Это строка - аналог полученной нужной строки

фонарик 10.03.2013 20:56

Цитата:

Сообщение от Deff (Сообщение 239808)
<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 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>

Вот такой расклад с переменной BUM вместо текста не работает :(

Deff 10.03.2013 20:58

Ага - разбежались...
Нун сразу было говорить и приводить примеры с несколькими поисками, - Сейчас нет смысла в данной переменной,
Кусок парсицо строго под "sarleon_recruit" - и для другой строки не сработает, посколь нун искать общую закономерность для любой такой строки при парсе текста
Поясню - Вы уверены что для любой другой переменной, arr2 - будет стоять cледом за за ней в квадратных скобках ?
И второе - выделите нужные переменные(для BUM) красным в исходном тексте

фонарик 10.03.2013 22:05

Структура везде одинаковая, относительно конечно. Есть например переменная 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". Не знаю ответил ли я на ваш вопрос, если бы я понимал хотябы общий принцип как вы это делаете, возможно не получилось бы так, что потребуются какие-то доработки :-?

Deff 11.03.2013 16:47

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

фонарик 11.03.2013 18:46

Мистер Deff, если случится великий потоп, вас спасать нужно будет обязательно :) Всё работает, всё проверил, всё правильно и лучше не придумать. Спасибо вам за добрые дела, ваши знания и опыт очень помогли мне, как хорошо что на этом форуме есть Вы

Deff 11.03.2013 19:18

фонарик,
Перебор с благозвучием... минус в карму

фонарик 13.03.2013 00:12

Репка сморщилась от натугов, но никак не получается :( Ваш скрипт работает каким-то хитрым образом вдобавок. Переменную BUM которая обозначается в скрипте, никак обновить не получается, функцию вызвать по событию повторно (т.е после загрузки страницы), тоже не получается. Подскажите, как на данном примере сделать так, чтобы при клике на синий блок или на зеленый, в переменную BUM присваивалось значение id из-под нажатого элемента и производился соответствующий поиск ?
http://learn.javascript.ru/play/rftSF

рони 13.03.2013 00:56

фонарик,
:-?
onmousedown="alert(arraysFind(this.id))"

Deff 13.03.2013 01:14

фонарик,
Наверняка - onclick="alert(arraysFind(this.id))" -корректнее, поскольку пользователь нажав - еще раздумывает, а вот нажав отпустив - ожидает действия

фонарик 13.03.2013 15:08

Вот вы привели пример с alert, и представить себе не можете сколько часов я думал и пытался сделать так, чтобы alert работал непосредственно из функции arraysFind :-? Но все-таки, не смотря на то, что смотреть на ваш скрипт изнутри было страшновато, проблему решил :) Оказалось, что там alert вне тела самой функции, потому и не работало :D Большое вам спасибо за подсказку.

фонарик 13.03.2013 18:46

Никак не могу понять, почему нельзя определить размер массива :( Приписываю к массиву .lenght, но не работает. Подскажите пожалуйста, как в вашем скрипте определить размер массива?
http://learn.javascript.ru/play/0mZIH
(строка 43)

рони 13.03.2013 18:55

фонарик, массив Out , а arr - его элементы
alert(Out.length)

фонарик 13.03.2013 19:06

рони, похоже на то :) Получается тогда что-то вроде:
alert(Out[0].length)
Спасибо за подсказку :)

фонарик 16.03.2013 03:57

Мистер 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>

Deff 16.03.2013 05:42

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

фонарик 16.03.2013 14:19

Большое вам спасибо :)

В переменных itm_ перед названием, т.е после кавычки стоит пробел
Код:

" itm_ankle_boots"," itm_leather_jacket"," itm_linen_tunic",
откуда образуется этот пробел я сам наверно так и не разгадаю :-? Не поможете его убрать? :)

Deff 16.03.2013 16:52

Цитата:

Сообщение от фонарик
В переменных itm_ перед названием, т.е после кавычки стоит пробел

Поправил
В исходнике строки
[ itm_ankle_boots, itm_leather_jacket, itm_linen_tunic, itm_leather_vest, itm_cudgel, itm_warh

фонарик 16.03.2013 17:54

Проверил на своих кракозябрах, все правильно обрабатывается, все как нужно. Чтоб я без вас делал :D Спасибо.


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