Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   регулярные выражения (https://javascript.ru/forum/events/23675-regulyarnye-vyrazheniya.html)

syegorius 01.12.2011 22:03

регулярные выражения
 
доброе время суток

подскажите пожалуйста как в регулярном выражении указать "не слово", т. е. вот это /[^a]*/ значит все символы кроме "а", а как указать все кроме слова "hello"?

заранее спасибо за ответы!

devote 01.12.2011 22:05

/[^(?:hello)]*/

trikadin 01.12.2011 22:21

devote, ну-ну...

alert("olleh".match(/[^(?:hello)]/));


Все специальные символы в квадратных скобках - просто символы. За исключением дефиса.

syegorius 01.12.2011 22:36

а если их закоментить, т. е. "\(", "\)" и "\?" это что то даст?

trikadin 01.12.2011 22:43

Цитата:

Сообщение от syegorius
а если их закоментить, т. е. "\(", "\)" и "\?" это что то даст?

Нет.

Опишите подробнее, что именно требуется? Может, можно решить и без такого...

devote 01.12.2011 22:51

ну значит никак это не сделать, обычно отрицаниями не пользуюсь.

trikadin 01.12.2011 22:59

Цитата:

Сообщение от devote
ну значит никак это не сделать, обычно отрицаниями не пользуюсь.

Просто можно попробовать вывернуться на чём-то вроде x(?!y).

А вообще да, отрицания в регах слабо сделаны.

Aetae 01.12.2011 23:03

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

trikadin 01.12.2011 23:18

Цитата:

Сообщение от Aetae
Вообще условие бред, скорей всего вам нужно не то что вы просите.

Потому и прошу уточнить...

syegorius 02.12.2011 00:15

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

по поводу отрицания слова, то мне это нужно потому что я не раз уже сталкивался с этим, столкнулся сегодня и думаю, что еще не раз столкнусь и иногда просто не вижу другого способа создать регулярное выражение кроме как не отрицанием именно не символа, а целого слова!

ну а теперь собственно о новой проблеме:

есть вот такой код:

var is=1
var string='Hello <span id="esui0" class="bold">a<span id="esui0" class="underline">mig</span>o</span>)<span class="inactive" id="anchor1"></span>some text<span class="some-class">and some text</span><span class="inactive" id="anchor0"></span>';
var enteredREN=new RegExp('(^.*anchor'+(is-1)+'[^>]*></span>)(.*)(<span.*anchor'+is+'.*$)','ig');
var enteredRENN=new RegExp('(^.*anchor'+is+'[^>]*></span>)(.*)(<span.*anchor'+(is-1)+'.*$)','ig');
var entered=string.replace(enteredREN,'$2');
if(entered!=='')entered=cHtml.replace(enteredRENN,'$2');


задача - нужно получить содержимое которое находится между span#anchor0 и span#anchor1, причем span#anchor1 может быть как после span#anchor0 так и перед, плюс между ними может быть не только текст но и теги.

как видите выше одно регулярное выражение написано для случая когда span#anchor1 после span#anchor0, а второе - когда перед.
но если последовательность span#anchor1 после span#anchor0, то когда происходит первая проверка, она возвращает всю строку, и вторая проверка не срабатывает.

скажите можно ли как-то это обойти, но без добавление в условие проверки if(entered!=='') entered==string, то есть что бы если не найдено то что я ищу возвращалась не проверяемая строка, а false или null

devote 02.12.2011 00:24

var is=1 
var string='Hello <span id="esui0" class="bold">a<span id="esui0" class="underline">mig</span>o</span>)<span class="inactive" id="anchor1"></span>some text<span class="some-class">and some text</span><span class="inactive" id="anchor0"></span>'; 

var enteredREN=new RegExp('(^.*anchor'+(is-1)+'[^>]*></span>)(.*)(<span.*anchor'+is+'.*$)','ig'); 
var enteredRENN=new RegExp('(^.*anchor'+is+'[^>]*></span>)(.*)(<span.*anchor'+(is-1)+'.*$)','ig'); 

if ( enteredREN.test( string ) ) {
var entered= string.replace(enteredREN,'$2'); 
} else {
var entered=string.replace(enteredRENN,'$2');
}

alert( entered );

Pavel M. 02.12.2011 11:09

Цитата:

Сообщение от syegorius
задача - нужно получить содержимое которое находится между span#anchor0 и span#anchor1, причем span#anchor1 может быть как после span#anchor0 так и перед, плюс между ними может быть не только текст но и теги.

так пойдет ?

var string='Hello  <span id="esui0" class="bold">a<span id="esui0"  class="underline">mig</span>o</span>)<span  class="inactive" id="anchor1"></span>some text<span  class="some-class">and some text</span><span  class="inactive" id="anchor0"></span>';

var re = /<span[^>]+id="anchor(0|1)"><\/span>([\s\S]+)<span[^>]+id="anchor(0|1)"><\/span>/;

var res = re.exec(string);

if (res) {
    alert(res[2]);
}

syegorius 02.12.2011 16:38

Цитата:

Сообщение от Pavel M. (Сообщение 140321)
так пойдет ?

var string='Hello  <span id="esui0" class="bold">a<span id="esui0"  class="underline">mig</span>o</span>)<span  class="inactive" id="anchor1"></span>some text<span  class="some-class">and some text</span><span  class="inactive" id="anchor0"></span>';

var re = /<span[^>]+id="anchor(0|1)"><\/span>([\s\S]+)<span[^>]+id="anchor(0|1)"><\/span>/;

var res = re.exec(string);

if (res) {
    alert(res[2]);
}

ну этот пример подойдет, но не для всех случаев, тем не менее он меня вдохновил немного по другому переписать шаблон

спасибо!

trikadin 02.12.2011 16:43

syegorius, вообще, если у вас эта строка изначально в dom-дереве находится, то погуглите в сторону range/textrange.

syegorius 02.12.2011 21:10

ну я вообще то этим и занимаюсь, пишу небольшой texteditor.

два спана про которые идет речь выше проверяют, что ввел пользователь, я пытаюсь сделать так что бы в случае копи/паста из других документов вставлялся только чистый текст

еще что меня беспокоит - это будет ли успевать браузер обрабатывать столько операций за время между нажатием двух клавиш в случае если пользователь быстро печатает?

trikadin 02.12.2011 21:58

Цитата:

Сообщение от syegorius
еще что меня беспокоит - это будет ли успевать браузер обрабатывать столько операций за время между нажатием двух клавиш в случае если пользователь быстро печатает?

Нет. Лучше на каждое третье-четвёртое нажатие обрабатывать.


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