Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.05.2012, 13:19
Аватар для GuardCat
Просто любитель
Отправить личное сообщение для GuardCat Посмотреть профиль Найти все сообщения от GuardCat
 
Регистрация: 13.09.2011
Сообщений: 300

Регулярки: исключение условия из результатов поиска
Например, нужно получить цифры, обрамлённые дефисами, но без этих дефисов:
var str = "aaaaaaa-0-aaa-02-aaa-3-aa-4aaa8-aaa-4-a232a7a8a":

var r = /-\d+-/g // Так будет вместе с дефисами.

var r = /-\d+(?=-)/g // Так будет с одним дефисом слева.

var r = /(?=-)\d+(?=-)/g // А так match вернёт null :-(


Прошу помощи в поиске ответа на вопросы:

1. Как получить цифры без дефисов в указанном случае максимально простой регуляркой?
2. Почему третий вариант r не работает?

Последний раз редактировалось GuardCat, 31.05.2012 в 13:21.
Ответить с цитированием
  #2 (permalink)  
Старый 31.05.2012, 13:27
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Поскольку регулярные выражения в js не поддерживают ретроспективных проверок, остается извращаться. Например, так
var str = "aaaaaaa(-12-)aaa(02)aaa(3)aa(4aaa8)aaa(4)a232a7a8a";

alert(
	/-(\d+)(?=-)/.exec( str )[ 1 ]
);


Сообщение от GuardCat
2. Почему третий вариант r не работает?
потому, что опережающая и ретроспективная проверки находят позиции, а не текст. Пример для понимания:
alert( "[]".replace( /(?=])/, '1234' ) );
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 31.05.2012 в 13:39.
Ответить с цитированием
  #3 (permalink)  
Старый 31.05.2012, 13:40
Аватар для GuardCat
Просто любитель
Отправить личное сообщение для GuardCat Посмотреть профиль Найти все сообщения от GuardCat
 
Регистрация: 13.09.2011
Сообщений: 300

nerv_, а я себе даже такой костыль сделал:

function normalMatch(r, text) {
  var result = [ ], oneResult;
  while( oneResult = r.exec( text ) ) {
    result.push( oneResult[1] );
  }
  return result;
}

var str = "aaaaaaa-0-aaa-02-aaa-3-aa-4aaa8-aaa-4-a232a7a8a";
var r = /-(\d+)-/g;

alert( normalMatch( r, str ) );

Но думал есть что-то попроще...
Ответить с цитированием
  #4 (permalink)  
Старый 31.05.2012, 13:47
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Я вот только не пойму, откуда в моем примере скобки взялись вместо дефисов?
the magic
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #5 (permalink)  
Старый 31.05.2012, 13:54
Аватар для GuardCat
Просто любитель
Отправить личное сообщение для GuardCat Посмотреть профиль Найти все сообщения от GuardCat
 
Регистрация: 13.09.2011
Сообщений: 300

nerv_, это я вначале скобки выложил по ошибке =)
Ответить с цитированием
  #6 (permalink)  
Старый 31.05.2012, 15:30
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от GuardCat
Например, нужно получить цифры, обрамлённые дефисами, но без этих дефисов:
<script type="text/javascript">
var str ='aaaaaaaa-0-aaa-02-aaa-3-aa-4aaa8-aaa-4-a232a7a8a';
var Dig=str.split(/[\s\S]*?(\-[0-9]+?-)/ig) //
//alert(Dig)
if(str!=Dig[0]){
  var DigOut=[], j = 0;
  for(var i in Dig){
    if(Dig[i].replace(/[0-9]+/ig,'')=='--'){
    DigOut[j]=-parseFloat(Dig[i]);j++; //Тут первый "0" - отбрасывает,посколь цифра, если нужна строка, мон релизовать иначе
    }
  } alert(DigOut);
} else {alert('Не найдено')}

</script>

Последний раз редактировалось Deff, 31.05.2012 в 15:33.
Ответить с цитированием
  #7 (permalink)  
Старый 31.05.2012, 16:26
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

я так делаю
txt = "dfhsdfj-26774-jdfur";
reg=/-\d+(\.\d+)?-/img;
chislo=txt.match(reg);
chislo=chislo[0].toString();//так обрабатывается один результат, но спомощью цикла можно все получить
chislo=chislo.replace(/-/img,"");
alert(chislo)
Ответить с цитированием
  #8 (permalink)  
Старый 31.05.2012, 19:41
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

правда, может быть опасно, ибо не учитывается дефис перед числом. зато без цикла
alert( "aaaaaaa-0-aaa-02-aaa-3-aa-4aaa8-aaa-4-a232a7a8a".match(/\d+(?=-)/g).join("\n") );
Ответить с цитированием
  #9 (permalink)  
Старый 31.05.2012, 20:02
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

melky, Красиво!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывод результатов поиска в таблицу в отдельном окне muhrab Элементы интерфейса 16 02.07.2009 17:26