Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   не работает regexp test (https://javascript.ru/forum/misc/26586-ne-rabotaet-regexp-test.html)

asmend 14.03.2012 04:12

не работает regexp test
 
var str='0123456789';
var re=/(?!34)/;

if (re.test(str))
alert('Yes');
else
alert('No');


почему в результате получается в итоге true всегда? Должно же быть true если только в строке не окажется 34.

devote 14.03.2012 05:10

var str='0123456789';
if ( str.indexOf('34') == -1 )
alert('Yes');
else
alert('No');

asmend 14.03.2012 05:15

Так не подойдет, это я для примера написал, нужно как-то заставить работать тот пример

devote 14.03.2012 05:23

var str='0123456789';
var re=/34/;
 
if (!re.test(str))
alert('Yes');
else
alert('No');

asmend 14.03.2012 05:34

К сожалению так тоже не подойдет ))
Нужно именно что бы не было определенного слова в строке

Pavel M. 14.03.2012 10:55

Цитата:

Сообщение от asmend
Должно же быть true если только в строке не окажется 34.

поменяйте на позитивный просмотр вперед - все получится

var str='0123456789',
	re=/(?=34)/;
 
if (re.test(str))
  alert('В строке есть 34');
else
  alert('В строке нет 34');


str='012356789';
 
if (re.test(str))
  alert('В строке есть 34');
else
  alert('В строке нет 34');

asmend 14.03.2012 16:40

Цитата:

поменяйте на позитивный просмотр вперед - все получится
так заработало, но мне еще нужно указать то что должно идти после 34, и тогда опять перетсает работать.


var str='0123456789';
var re=/(?=34)56/;

if (re.test(str))
alert('Yes');
else
alert('No');

asmend 14.03.2012 22:13

Нужно что бы этот пример заработал как и должен. Если в строке перед "56" нет "34", то возвращал true. Если в строке перед "56" есть "34" то false. Я не понимаю почему это не работает

var str='0123456789';
var re=/(?!34)56/;
if (re.test(str))
alert('Yes');
else
alert('No');

asmend 14.03.2012 22:14

Так же как я писал это нужно сделать обязательно с помощью regexp test и не меняя возвращаемого результата на противоположный (имею ввиду не делать if (!re.test(str)) )

devote 14.03.2012 23:48

asmend,
ну тогда тебе смело могу сказать что в регах нет возможности проверять отрицания.

asmend 15.03.2012 00:05

Цитата:

Сообщение от devote
ну тогда тебе смело могу сказать что в регах нет возможности проверять отрицания.

как нет? По книжкам где читал все так и пишется (?!слово которого не должно быть), но почему-то не работает

devote 15.03.2012 00:14

Цитата:

Сообщение от asmend
как нет? По книжкам где читал все так и пишется (?!слово которого не должно быть), но почему-то не работает

не слово а символ... парсер регов перебирает посимвольно, тоесть не находит символ если идет....

asmend 15.03.2012 01:20

Как раз слово, символ пишется так [^a]

devote 15.03.2012 01:47

Цитата:

Сообщение от asmend
Как раз слово, символ пишется так [^a]

Ты так и не понял, может все же нормально почитаем доку про работу с RegExp

возьмем пример найти test если за буквой t не идет 25
var re = /test(?!25)/;
alert( re.exec( "test25" ) ); // результат null не найдено

найти слово tes с любым окончанием, но не находить если следует 25:
var re = /tes.?(?!25)/;
alert( re.exec( "test25" ) ); // результат tes, тоесть всеравно выдал, хотя мы дали понять что не должно быть.


Вывод из всего этого, то что он проверяет не целое слово а лишь последний символ перед указанным правилом.

devote 15.03.2012 02:26

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 163226)
devote,
зачем во втором примере вопросительный знак после t?

Указывает на то что может быть любой символ.

devote 15.03.2012 02:50

Цитата:

Сообщение от Maxmaxmахimus
он указывает что буква s может быть, а может и не быть.

ну да верно, точку перед ним не поставил... но сути пример от этого не теряет.

Pavel M. 15.03.2012 09:16

Цитата:

Сообщение от asmend (Сообщение 163196)
Нужно что бы этот пример заработал как и должен. Если в строке перед "56" нет "34", то возвращал true. Если в строке перед "56" есть "34" то false. Я не понимаю почему это не работает

var str='0123456789';
var re=/(?!34)56/;
if (re.test(str))
alert('Yes');
else
alert('No');

попробуйте так

var str='0123456789';
var re=/(?!34)..56/;
if (re.test(str))
  alert('Yes'); // перед 56 нет 34
else
  alert('No');  // перед 56 есть 34


str='0123356789';
if (re.test(str))
  alert('Yes'); // перед 56 нет 34
else
  alert('No');  // перед 56 есть 34

asmend 15.03.2012 16:50

Цитата:

Сообщение от Pavel M. (Сообщение 163255)
попробуйте так

var str='0123456789';
var re=/(?!34)..56/;
if (re.test(str))
  alert('Yes'); // перед 56 нет 34
else
  alert('No');  // перед 56 есть 34


str='0123356789';
if (re.test(str))
  alert('Yes'); // перед 56 нет 34
else
  alert('No');  // перед 56 есть 34

так вроде работает, а что значат две точки?

рони 15.03.2012 19:15

Цитата:

Сообщение от Maxmaxmахimus
точка это любой непробельный символ

???

Pavel M. 15.03.2012 20:06

Цитата:

Сообщение от asmend
так вроде работает, а что значат две точки?

точек нужно столько, на сколько символов мы заглядываем вперед
в (?!34) два символа - значит две точки

asmend 15.03.2012 21:20

Цитата:

Сообщение от Pavel M. (Сообщение 163255)
попробуйте так

var str='0123456789';
var re=/(?!34)..56/;
if (re.test(str))
  alert('Yes'); // перед 56 нет 34
else
  alert('No');  // перед 56 есть 34


str='0123356789';
if (re.test(str))
  alert('Yes'); // перед 56 нет 34
else
  alert('No');  // перед 56 есть 34


А еще такой вопрос, как сделать просто что если нет в строке 34, то true. Если есть то false?

Pavel M. 15.03.2012 21:55

это уже вроде бы было выше в теме
Цитата:

Сообщение от devote (Сообщение 163013)
var str='0123456789';
if ( str.indexOf('34') == -1 )
alert('Yes');
else
alert('No');


asmend 15.03.2012 22:12

нужно регуляркой обязательно

melky 15.03.2012 22:29

alert( 
*!*
     !/34/.test( 
*/!*
          prompt( 
               'Enter the string', 
               '3246<34>590'
          )
     ) 
);

asmend 15.03.2012 22:51

Цитата:

Сообщение от melky (Сообщение 163405)
alert( 
*!*
     !/34/.test( 
*/!*
          prompt( 
               'Enter the string', 
               '3246<34>590'
          )
     ) 
);

Про то что бы не изменять результат функции на противоположный я тоже писал что нельзя

asmend 16.03.2012 01:34

Я понимаю для чего регулярные выражения, просто есть один скрипт который изменить нет возможности можно менять только само регулярное выражение что бы добиться нужного результата.
Что невозможно сделать мне кто-то уже вроде писал на счет предидущего примера, а оказалось возможно )

Pavel M. 16.03.2012 12:11

Цитата:

Сообщение от asmend
Про то что бы не изменять результат функции на противоположный я тоже писал что нельзя

может быть так устроит
var str = '0123456789';
var re = /^(?!.*34)/;

if (re.test(str))
  alert('Yes'); // нет 34
else
  alert('No');  // есть 34


str = '0123356789';


if (re.test(str))
  alert('Yes'); // нет 34
else
  alert('No');  // есть 34

Pavel M. 16.03.2012 13:20

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 163486)
Pavel M., а что он вернет если после начала не следует 34?

см. пример выше - вернет true

asmend 16.03.2012 17:12

Pavel M.,
Спасибо, это то что надо) Сам бы еще наверно не скоро додумался )


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