Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярки: исключение условия из результатов поиска (https://javascript.ru/forum/misc/28728-regulyarki-isklyuchenie-usloviya-iz-rezultatov-poiska.html)

GuardCat 31.05.2012 13:19

Регулярки: исключение условия из результатов поиска
 
Например, нужно получить цифры, обрамлённые дефисами, но без этих дефисов:
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 не работает?

nerv_ 31.05.2012 13:27

Поскольку регулярные выражения в 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' ) );

GuardCat 31.05.2012 13:40

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

Но думал есть что-то попроще...

nerv_ 31.05.2012 13:47

Я вот только не пойму, откуда в моем примере скобки взялись вместо дефисов? :blink:
the magic :D

GuardCat 31.05.2012 13:54

nerv_, это я вначале скобки выложил по ошибке =)

Deff 31.05.2012 15:30

Цитата:

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

Dim@ 31.05.2012 16:26

я так делаю
txt = "dfhsdfj-26774-jdfur";
reg=/-\d+(\.\d+)?-/img;
chislo=txt.match(reg);
chislo=chislo[0].toString();//так обрабатывается один результат, но спомощью цикла можно все получить
chislo=chislo.replace(/-/img,"");
alert(chislo)

melky 31.05.2012 19:41

правда, может быть опасно, ибо не учитывается дефис перед числом. зато без цикла :)
alert( "aaaaaaa-0-aaa-02-aaa-3-aa-4aaa8-aaa-4-a232a7a8a".match(/\d+(?=-)/g).join("\n") );

Deff 31.05.2012 20:02

melky, Красиво!


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