Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Простая регулярка (https://javascript.ru/forum/misc/30786-prostaya-regulyarka.html)

PashPP 15.08.2012 20:40

Простая регулярка
 
Еще раз всем привет.
Пробую написать простую регулярку так, чтобы попадало все, что НЕ начинается с += или = или ++ и после цифры.

В общем, регулярку чтоб было сначала += или = или ++ и после цифры написал:
str = prompt("sd");
re = /(?:\+\=|\=|\+\+)(?=\d)\d*/;
found = str.match(re);
alert(found)


Нужна полностью обратная ей. Кстати, я эту правильно написал, вроде работает?

Deff 15.08.2012 21:06

PashPP,
Приведите пару примеров входных строк и строк в итоге

PashPP 15.08.2012 21:12

Deff,
f = str.match(re)
re = ???

str = "+=43534"
f = null

str = "++2323"
f = "null"

str = "=343434"
f = null

str = "dsfsdf"
f = "dsfsdf"

str = "=43gfvb"
f = "gfvb"

str = "+====+"
f = "===+"

PashPP 15.08.2012 21:13

В общем, мне это надо чтоб ввод всех значений, кроме начинающихся с ++, =, += и дальше цифры отменялся.

Aetae 15.08.2012 21:31

str = "=43gfvb";
alert(/^(?:\+[+=]|=)\d/.test(str) ? str : null)

str = "d43gfvb";
alert(/^(?:\+[+=]|=)\d/.test(str) ? str : null)

Deff 15.08.2012 21:42

<pre>
f = str.match(re)
 re = ???

 str = "+=43534"
 f = null

 str = "++2323"
 f = "null"

 str = "=343434"
 f = null

 str = "dsfsdf"
 f = "dsfsdf"

 str = "=43gfvb"
 f = "gfvb"

 str = "+====+"
 f = "===+"
</pre>

<script type="text/javascript">
function TstFunc()  {
 var a = document.getElementById('Input');
 var str = a.value;
 var str2= str.replace(/\+?[\+=]\d*/i,'')

 alert(str2)
}
</script>
<input id="Input" type="text"  value="+=43534"><input type="button" value="Test" onclick="TstFunc()">

PashPP 15.08.2012 21:42

Aetae,
/^(?:\+[+=]|=

Сорри, но не то.
Кстати, может мне кто-то обьяснить простыми словами, что делает символ ^ и $ в начале и конце строк? Со справочника не сильно понял. То ли оно ищет с конца/начала, то ли еще что-то...

Deff 15.08.2012 21:44

Цитата:

Сообщение от PashPP
То ли оно ищет с конца/начала,

До конца($) и сначала(^) ( при g (глобальном поиске

Deff 15.08.2012 21:55

PashPP,
У Aetae, Имхо правильнее он ток звездачку забыл
(Поправь в моей версии
var str2=str.replace(/^(?:\+[+=]|=)\d*/,'')

PashPP 15.08.2012 22:12

Deff,
Спасибо, конечно.
Но вы оба написали обратное тому, что я просил.
Регулярка должна ловить все, что НЕ ловит предыдущие ваши да и моя с стартовом посте.
Вот в примере с replace должно удаляться все, кроме += / ++ / == и цифры. а не наоборот.
Конечно, у меня есть идеи, как это сделать и с регулярками выше, но это немного криво и мне бы чисто ради интереса и обучению регуляркам хотелось увидеть регулярку полностью обратную имеющимся.
Которая должна брать все, что не похоже на +=434343.

Цитата:

Сообщение от Deff
То ли оно ищет с конца/начала,

До конца($) и сначала(^) ( при g (глобальном поиске

Эм. В смысле, что при значке ^ рядом с знаком, она будет искать именно его, а потом все остальное? Можно пример, пожалуйста, с небольшим пояснением.

Deff 15.08.2012 22:14

PashPP,
Цитата:

Сообщение от Deff
Приведите пару примеров входных строк и строк в итоге

То что Вы привели - То Вам и Выдали!!

oneguy 15.08.2012 22:16

Цитата:

Сообщение от Deff
До конца($) и сначала(^) ( при g (глобальном поиске

Это не совсем правильно.
^ и $ обозначают начало и конец входной строки соответственно, а при флаге m - ещё и начало и конец подстроки входной строки, отделённой символами переноса строки.
Наличие флага g на это не влияет.
Примеры:
alert(/^12/.test("12sddaas")); //true
alert(/^12/.test("312ssddd")); //false
alert(/[a-z]{2}$/.exec("312ssddd")[0]); //dd
alert(/[a-z]{2}/.exec("312ssddd")[0]); //ss
alert("sddaas\nsssss\n3333".match(/^[a-z]{2}/gm).join(" ")); //sd ss
alert("sddaas\nsssss\n3333".match(/^[a-z]{2}/g).join(" ")); //sd
alert("sddaas\nsss35\n3333".match(/\d{2}$/gm).join(" ")); //35 33

PashPP 15.08.2012 22:23

Цитата:

Сообщение от Deff
То что Вы привели - То Вам и Выдали!!

Нет.
Мой пример раньше:
f = str.match(re)
re = ???

str = "+=43534"
f = null

str = "++2323"
f = "null"

str = "=343434"
f = null

str = "dsfsdf"
f = "dsfsdf"

str = "=43gfvb"
f = "gfvb"

str = "+====+"
f = "===+"

Ни с re = /^(?:\+[+=]|=)\d/ , ни с re = /\+?[\+=]\d*/i такого результата не будет. По сути, вы написали ту самую регулярку. что и у меня в стартовом посте /(?:\+\=|\=|\+\+)(?=\d)\d*/ только красивее.

oneguy,
Эм. А что означает "начало и конец входной строки"?
То есть эти символы должны стоять точно первыми/последними и остальное. если есть регулярка будет хватить с серединки?

Deff 15.08.2012 22:27

<pre>
f = str.match(re)
 re = ???

 str = "+=43534"
 f = null

 str = "++2323"
 f = "null"

 str = "=343434"
 f = null

 str = "dsfsdf"
 f = "dsfsdf"

 str = "=43gfvb"
 f = "gfvb"

 str = "+====+"
 f = "===+"
</pre>

<script type="text/javascript">
function TstFunc()  {
 var a = document.getElementById('Input');
 var str = a.value;
  var str2= str.replace(/(\+?[\+=]\d*)/i,'')
 var str2=RegExp["$1"]
 alert(str2)
}
</script>
<input id="Input" type="text"  value="+=43534"><input type="button" value="Test" onclick="TstFunc()">

Aetae 15.08.2012 22:29

PashPP,
А может не удалять гланды через жопу и не использовать match где он не нужен?

oneguy 15.08.2012 22:41

Цитата:

Сообщение от PashPP
oneguy,
Эм. А что означает "начало и конец входной строки"?
То есть эти символы должны стоять точно первыми/последними и остальное. если есть регулярка будет хватить с серединки?

Нет. Если не установлен флаг m, то символ ^ означает, что текущий индекс во входной строке равен 0, $ - соответственно длине входной строки. Эти символы не ловят никаких символов во входной строке, а проверяют текущую позицию при поиске.

PashPP 15.08.2012 22:43

Deff,
Хм. Спасибо за пример.
Aetae,
Как человек не сведущий в медицине и жопах, не смогу ответить.

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

PashPP 15.08.2012 22:51

oneguy,
Хм. Что-то уже догадываюсь, но...
Текущий индекс чего?

Aetae 15.08.2012 22:53

Регулярка обратная данной это: /^(?:[^+][^+=]|[^=])\D+/ .
Только она вам не поможет в случае с match и приведёнными примерами. Как ни старайся, а пинцетом гвоздь не забьёшь.

PashPP 15.08.2012 22:56

Aetae,
Спасибо.

oneguy 15.08.2012 23:14

Цитата:

Сообщение от PashPP
oneguy,
Хм. Что-то уже догадываюсь, но...
Текущий индекс чего?

Текущий индекс... Думал, как это объяснить простыми словами.
Это такая внутренняя переменная при выполнении регулярного подвыражения, обозначающая позицию во входной строке, где закончилось выполнение предыдущего подвыражения, и начнётся выполнение следующего.
Например, /\d2$/.test("12")
Вначале текущий индекс равен 0, так как нет флага g. После выполнения подвыражения \d текущий индекс будет 1, после выполнения 2 - равен 2, поэтому перед выполнением $ текущий индекс равен 2, то есть длине строки, и это $ проходит.

PashPP 15.08.2012 23:23

oneguy,
Кажется, что понял. Спасибо.


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