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

Magneto 28.05.2012 19:19

Ругулярные выражения.
 
Есть следующий текстовый документ:
{
   "http://habrahabr.ru/": {
      "id": "http://habrahabr.ru/",
      "shares": 832
   },
   "http://habrahabr.ru/company/apps4all/blog/144705/": {
      "id": "http://habrahabr.ru/company/apps4all/blog/144705/",
      "shares": 11
   }
}


Нужно при помощи регулярки получить числа: 832 и 11. При этом нужно учесть что второго числа может и небыть, в данном случае 11.

Как пробовал я:
var txt = '{"http://habrahabr.ru/events/coming/":{"id": "http://habrahabr.ru/events/coming/","shares": 832},"http://habrahabr.ru/":{"id": "http://habrahabr.ru/","shares": 11}}';

var matches = txt.math(/"shares":\s+(\d+)\s+/g);


При это я ожидал что в:
matches[0] -> будет изначальный документ
matches[1] -> первое значение (832)
matches[2] -> второе значение (11), если есть

Но как оказалось все не так, постоянно возвращается непонятная фигня.

Поэтому помогите ))

nerv_ 28.05.2012 19:31

var found = txt.match( /"shares":\s*\d+/gm );
// дальше сами )

nerv_ 28.05.2012 19:37

Magneto, видимо, мне следовало сразу добавить - про сохраняющие скобки в матче забудьте (при глобальном поиске).

Deff 28.05.2012 19:53

<script type="text/javascript">
var txt = '{"http://habrahabr.ru/events/coming/":{"id": "http://habrahabr.ru/events/coming/","shares": 832},"http://habrahabr.ru/":{"id": "http://habrahabr.ru/","shares": 11}}';
re = /"shares": [0-9]+[^0-9]/gm;
found = txt.match(re);
for(var i in found){
 found[i]=found[i].replace(/^[^0-9]+/g,'')
 found[i]=parseFloat(found[i])
alert('>'+found[i]+'<')
}
</script>

9xakep 28.05.2012 21:28

str = '{"http://habrahabr.ru/events/coming/":{"id": "http://habrahabr.ru/events/coming/","shares": 832},"http://habrahabr.ru/":{"id": "http://habrahabr.ru/","shares": 11}}';
num1 = str.match(/("shares":\s(\d+))|"shares":\s/g)[0]
num2 = str.match(/("shares":\s(\d+))|"shares":\s/g)[1]
alert("num1: "+num1+"\nnum2: "+num2)

Deff 28.05.2012 21:44

9xakep, попробуй заменить цифру на такую 832F

9xakep 28.05.2012 21:59

Deff,
ТС не написал, будет ли там буквы, а так добавить parseFloat не проблема. Или опять же регулярками вытаскивать тупо все что после shares, а потом парсить

Deff 28.05.2012 23:01

Цитата:

Сообщение от 9xakep
а так добавить parseFloat не проблема.

Cогласен - тады твой точнее - Поправил свой

Kolyaj 29.05.2012 16:36

Зачем регулярка, если это JSON?

Deff 29.05.2012 17:01

Kolyaj,
У мну например - такая задачка - типовая - к движку доступа нет

Kolyaj 29.05.2012 17:06

К какому движку?

Deff 29.05.2012 22:32

Kolyaj,
К тому, что json выдаёт - Не томи - Давай полный Спичь

Kolyaj 30.05.2012 09:01

А зачем доступ к тому, что json выдаёт? В этой теме все бросились парсить json зачем-то регулярками, вместо того, чтобы сделать JSON.parse(txt)['http://habrahabr.ru/'].shares

Deff 30.05.2012 09:23

Kolyaj, http://www.spravkaweb.ru/jscript/methods/jsonparse/
Для меня это новое, но судя по тому, что только прочёл, к этому блюду, нужны еще и проверки,
Цитата:

тобы использовать особенности версии 5.8, компьютер с интерфейсом Windows Script должен запустить IActiveScriptProperty::SetProperty.

Internet Explorer 8 выбирает и работает с особенностями языка версии 5.8, когда режим документа для него установлен в "Internet Explorer 8 Standards". В других случаях, используется версия 5.7

Kolyaj 30.05.2012 09:49

Цитата:

Сообщение от Deff
к этому блюду, нужны еще и проверки,

Какие проверки?

Deff 30.05.2012 10:18

Kolyaj,
Вы опытней... Наверняка применяли, если сказали а) - стоит наверно сказать и б) про подводные камни - если камней нет, то показали - пояснили, иначе похоже на красование..
Я методом не пользовался - поэтому имхо пока пользуюсь проверенным старым...
--------------------------------------
Написано, что метод действует начиная с версии js 5.8,
Дабы подключить в ИЕ, начиная только с 8 версии нужно перевести в режим "Internet Explorer 8 Standards".
В других случаях, используется версия 5.7, не поддерживающая данный метод

Kolyaj 30.05.2012 10:20

Я ж показал код.
Цитата:

Сообщение от Kolyaj
JSON.parse(txt)['http://habrahabr.ru/'].shares

Разве что ссылка на реализацию JSON для старых браузеров пригодится https://github.com/douglascrockford/JSON-js.

Magneto 30.05.2012 16:55

Цитата:

Сообщение от Kolyaj (Сообщение 177463)
А зачем доступ к тому, что json выдаёт? В этой теме все бросились парсить json зачем-то регулярками, вместо того, чтобы сделать JSON.parse(txt)['http://habrahabr.ru/'].shares

Изначально ключи (http://habrahabr.ru/ и пр.) неизвестны.

GuardCat 30.05.2012 17:09

Magneto, а если так:
var o = {
   "http://habrahabr.ru/": {
      "id": "http://habrahabr.ru/",
      "shares": 832
   },
   "http://habrahabr.ru/company/apps4all/blog/144705/": {
      "id": "http://habrahabr.ru/company/apps4all/blog/144705/",
      "shares": 11
   }
}; //как будто распарсили JSON

alert( o[ Object.keys( o )[0] ].shares );
?

observer 30.05.2012 17:09

Цитата:

Сообщение от Magneto (Сообщение 177557)
Изначально ключи (http://habrahabr.ru/ и пр.) неизвестны.

Что вы всех путаете? Задача какая?

Magneto 30.05.2012 18:08

GuardCat - хорошее решение, спасибо.

Цитата:

Сообщение от observer (Сообщение 177559)
Что вы всех путаете? Задача какая?

С условием данной задачи можно ознакомиться в первом посте этой темы.

P.S. Задачу давно решил.


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