Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите с регуляркой (https://javascript.ru/forum/misc/9982-pomogite-s-regulyarkojj.html)

Орёл 14.06.2010 14:39

Помогите с регуляркой
 
Нужно из текста вырезать всё что между кавычками делаю так:
text.match('/Тема\:\"(.*)\"/gi');
Но возвращаеться null

exec 14.06.2010 15:00

text.replace(/".+?"/gi, '""');

Орёл 14.06.2010 15:04

Цитата:

Сообщение от exec (Сообщение 59406)
text.replace(/".+?"/gi, '""');

мне не удалить надо,а вытащить

KOLANICH 14.06.2010 15:12

попробуй убрать глобал

exec 14.06.2010 15:16

text.match(/".+?"/gi);


Будет возвращён массив с найденными подстроками.

Орёл 14.06.2010 15:32

спасибо

FINoM 24.02.2012 03:57

Пардон за поднятие мертвой темы, не хотелось создавать новой.

Помогите плиз с регуляркой: нужно разбить строку на слова, делаю так:
' сок   молоко     работа '.replace(/\s+/g, ' ').replace( /\s(.*)\s/, '$1' ).split( ' ' ); //["сок", "молоко", "работа"]

Но если убрать пробел в начале, то получится так:
'сок   молоко     работа '.replace(/\s+/g, ' ').replace( /\s(.*)\s/, '$1' ).split( ' ' ); //["сокмолоко", "работа"]

А если убрать еще и в конце, то будет:
'сок   молоко     работа'.replace(/\s+/g, ' ').replace( /\s(.*)\s/, '$1' ).split( ' ' ); //["сокмолокоработа"]


Да, регулярки — большая дырка в моих знаниях, но я всё никак не могу с ними подружиться, застревая на простейших задачах.

На всякий случай: первый реплейс заменяет кучу пробелов на один, второй — убирает пробелы слева и справа (по крайней мере, мне бы так хотелось).

FINoM 24.02.2012 04:06

Сорри, вспомнил, что в php есть тая функция как trim, она же реализована и на яваскриптах.
http://alt-f4.ru/trim-in-javascript
В итоге:
'   сок    молоко  работа'.replace(/\s+/g, ' ').replace(/((\s*\S+)*)\s*/, "$1").replace(/\s*((\S+\s*)*)/, "$1").split( ' ' ); //["сок", "молоко", "работа"]


Хотя выглядит жутко. Есть варианты упрощения?

UPD:
'сок    молоко  работа '.replace(/\s+/g, ' ').replace(/\s*((\s*\S+)*)\s*/, "$1").split( ' ' )

Aetae 24.02.2012 04:12

alert(
'сок   молоко     работа'.split(/\s+/)
)

Проблема не в регулярках)

FINoM 24.02.2012 04:21

Цитата:

Сообщение от Aetae (Сообщение 159569)
alert(
'сок   молоко     работа'.split(/\s+/)
)

Проблема не в регулярках)

Ну всё равно придется пробелы по бокам убивать. Как это сделать без проверок?
'    сок   молоко     работа  '.split(/\s+/); //["", "сок", "молоко", "работа", ""]

Aetae 24.02.2012 04:25

alert(
'    сок   молоко     работа  '.match( /\S+/g )
)

FINoM 24.02.2012 04:27

Хах, спасибо.

Mахmaxmaximus 24.02.2012 05:03

FINoM,
хочешь регуляркам за 20 минут научу)? способ расскажу, я за час выучил пока этот способ не нашел.

FINoM 24.02.2012 05:18

Цитата:

Сообщение от Mахmaxmaximus
хочешь регуляркам за 20 минут научу)? способ расскажу, я за час выучил пока этот способ не нашел.

Ну а чего меня спрашивать? Статью зафигач, чтоле.

Mахmaxmaximus 24.02.2012 05:29

во первых вот отрывок из моей "книги".

Цитата:

регулярное выражение это строка,
только не обычная строка а которая пишется между двумя слешами
/строка/
вот что такое регулярне выражение.

Можно искать совпадение с текстом этой регулярной строки используя метод Матчь.
Например

"обычная строка конь".match(/регулярная строка/)

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

"обычная строка конь".match(/конь/)

найдет слово конь в обычной строке и вернетс ним массив ["конь"]

если бы было так

"обычная конь конь строка конь".match(/конь/)

то матчь нашел бы коня 3 раза в обычной строке и вернуоло бы массив всех нахождений
["конь", "конь", "конь"]

Регулярные выражения отличается от обычных строк не только отсутствием кавычек но еще и тем что в них можно использовать специальные символы, а в строках нет.
Например в регулярных выражениях есть комбинация \d и если мы её напишем, то этот спецсимвол(так они называются) будет означать что тут мы ожидаем увдеть цифру.

например


"обычная конь1 конь2 строка конь8".match(/конь\d/)

вернет массив из ["конь1", "конь2", "конь8"] таким образом если мы мы можем не знать какую именно цифру искать, но можем просто написать что после слова конь ожидается цифра))

каждый такой спец-символ вроде \d означает ТОЛЬКО ОДНУ ЦИФРУ)
То есть в "конь86".match(/конь\d/) найдется только ["конь8"]

то есть если мы ождаем после коня увидеть 2 цифры
то мы должны регулярное выражение писать так /конь\d\d/

все кони после которых идет НЕ 2 цифры не будут подходить и не проМатчатся)

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

/регулярка/g
/регулярка/i
/регулярка/m


g — глобальный поиск (обычно если епосле последнего слеша не поставить букву g, то ищется ТОЛКО ПЕРВОЕ СОВПАДЕНИЕ, если поставить g, то ищутся все совпадения); В примере выше с конем нужно ставить регулярку в режим g чтобы нашлись все кони а не только первый.

i — не различать строчные и заглавные буквы;

m — многострочный поиск.

можно использовать несколько флагов(эти буковки так называются) одновременно

например
/кОнЬ/gi - искать все совпадения с регуляркой а не только первое при том не различать заглавные и строчные.

спецсимволы которые понимает регулярка можешь посмотреть вот тут
http://javascript.ru/RegExp

Например есть даже спецсимвол означающий что мы ожидаем повторение предыдущего перед ним символа один или более раз
это символ +
то есть за место
"конь86".match(/конь\d\d/) мы можем написать
"конь86".match(/конь\d+/)
тогда найдутся все кони после который идет какая-то цифра один или более раз))
дальше сами разберетесь.
А во вторых вот способ как я научился регуляркам за 3 часа с нуля.
Это задача.

Используя эту таблицу http://javascript.ru/RegExp
, составь регулярку, которая будет находить в обычном тексте ссылки на ютьюб, при том будет сохранять в скобочную группу айдишник видео внутри этой ссылки.


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

Mахmaxmaximus 24.02.2012 05:42

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

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

nerv_ 24.02.2012 09:32

Цитата:

Сообщение от FINoM
Помогите плиз с регуляркой: нужно разбить строку на слова, делаю так:

Я, наверное, уже опоздал, но тем не менее. Логика в моей реализации простая - ищем любые символы кроме пробельных.
var x = ' сок   молоко     работа ';
var z = x.match( /[^\s]+/g );
alert( z.join( '\n' ) );

Mахmaxmaximus 24.02.2012 16:12

nerv_,
но точка доллар цифра это тоже непробельные символы, где логика?

9xakep 24.02.2012 16:52

Я правильно понимаю, что пробелы только с начала и в конце?
<script>
var str = '    сок   молоко     работа  '
var new_str = str.split(/\s+/); //["", "сок", "молоко", "работа", ""]
new_str.pop()
new_str.shift()
for(i=0;i<new_str.length;i++) {
console.log(new_str[i]) // ["сок", "молоко", "работа"]
console.log(new_str.length) //3
}
</script>

_____________
Блин скинул, и не посмотрел что есть 2ая страница)

Mахmaxmaximus 24.02.2012 17:29

var text = "А я люблю обмазываться свежим дезодорантоми и дрочить. Каждое 23-е февраля я хожу по земле с черным мешком для мусора и собераю в него все дезодоранты и кремы для бриться которые мне дарят. На два полных мешка целый день уходит. Зато, когда после тяжёлого дня я прихожу домой, иду в ванну, включаю горячую воду…ммм и сваливаю в нее свое сокровище. И дрочу, представляя, что меня поглотил единый организм защиты отечества. Мне вообще кажется, что отечество, умеет думать, у него есть свои семьи, города, чувства, не смывайте их в унитаз, лучше приютите у себя, говорите с ними, ласкайте их…. А вчера в ванной, мне преснился чудный сон, как будто я нырнул в море, и оно прератилось в отечество, рыбы, водоросли, медузы, все из отечества,требующее защиты даже небо, даже Путин!"


alert(text.match(    /[a-zа-я\d_-]+/ig     ))



разберем на составные

[a-z    а-я    \d    _    -]+


[ab] - означает один символ ИЛИ а ИЛИ бэ, то есть квадратные скобки имею смысл ИЛИ.

в нашем примере в квадратных скобках есть 5 членов:

1) a-z любая буква от a до z
2) а-я любая буква от а до я
3) \d любая цифра
4) _ жесткий пробел
5) - дефис

так вот, квадратные скобки означают ОДИН СИМВОЛ

при чем символ этот может подходить под первый член , под ИЛИ под второй член, и.т.п.
я бы мог тупо написать в квадратных скобках ВСЕ символы ожидаемые в словах) но мне вломы писать алфавиты по этому я воспользовался комбинациями означающими алфавиты))

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

nikita.mmf 24.02.2012 17:29

var str = '    сок   молоко     работа  ';
str.trim().split(/\s+/);
alert( str.trim().split(/\s+/) );

Aetae 24.02.2012 17:31

Цитата:

Сообщение от nerv_ (Сообщение 159593)
Я, наверное, уже опоздал, но тем не менее. Логика в моей реализации простая - ищем любые символы кроме пробельных.
var x = ' сок   молоко     работа ';
var z = x.match( /[^\s]+/g );
alert( z.join( '\n' ) );

http://javascript.ru/forum/misc/9982...tml#post159574
Цитата:

Сообщение от 9xakep (Сообщение 159680)
Я правильно понимаю, что пробелы только с начала и в конце?
<script>
var str = '    сок   молоко     работа  '
var new_str = str.split(/\s+/); //["", "сок", "молоко", "работа", ""]
new_str.pop()
new_str.shift()
for(i=0;i<new_str.length;i++) {
console.log(new_str[i]) // ["сок", "молоко", "работа"]
console.log(new_str.length) //3
}
</script>

Цитата:

Сообщение от nikita.mmf (Сообщение 159699)
var str = '    сок   молоко     работа  ';
str.trim().split(/\s+/);
alert( str.trim().split(/\s+/) );

А можно сделать и как оп в первом посте по данному вопросу, НО ЗАЧЕМ?

Aetae 24.02.2012 17:33

Цитата:

Сообщение от Mахmaxmaximus (Сообщение 159698)
/[a-zа-я\d_-]+/ig


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

Mахmaxmaximus 24.02.2012 17:43

Aetae,
у меня к тебе вопрос, мудак:
считаешь ли ты что я не знаю про букву ё и не знаю что эта регулярка её не найдет? или не считаешь. да или нет?

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

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

очевидно что я показывал как работают скобки, что есть алфавиты, и что есть символы например дефис и их можно написать так же как члены.

но ты наверное, в силу своего неумения определять важное и неважное, не догадался что определенные свойства алфавитов, например ё, в данном обучающим примере не существенны.


я понимаю, ты же просто не знал.... я не виню тебя, просто следи за словами будь добр.

Aetae 24.02.2012 17:56

..
Цитата:

Сообщение от Mахmaxmaximus (Сообщение 159706)
бла-бла-бла


Mахmaxmaximus 24.02.2012 18:27

Aetae,
:yes:

nerv_ 24.02.2012 22:00

Aetae, здравствуйте! Я видел Ваш пост и считаю его самым логичным решением проблемы. Вместе с тем, есть предположение, что мой вариант может работать чуть быстрее в связи с тем, что в символьный класс \s входит меньше символов, нежели в \S. С другой стороны, вполне вероятно, что использование в моем случае инвертированного символьного класса [^....] их уравновешивает :) Протестировал бы кто... Может Мишка возьмется?)

p.s.: впрочем, вероятно внутренняя реализация у них почти идентична.

Цитата:

Цитата из Фридла:
\s - Пропуск. В системах, ограничивающихся поддержкой ASCII, часто эквивалентно [•\f\n\r\t\v]. В системах с поддержкой Юникода также часто включает управляющий символ «следующей строки» U+0085, а иногда и свойство \p{Z} (описывается в следующем разделе).
\S - Heпропуск (обычно эквивалентно [^\s]).
короче шыло на мыло :D

Mахmaxmaximus 24.02.2012 22:16

Aetae,
твой вариант точки тоже захватит?

sanika 25.05.2012 01:46

не могу придумаит прпвило
 
Можно ли на яваскрипте сделать проверку текста?
Например текст имеет включения - это хорошо, но если есть [IMG]........[/IMG] но не радикал а других хостингов - вывести алерт что есть ошибка. Реально так сделать или javascript не справится с такой задачей?

Aetae 25.05.2012 04:41

Реально.
Бесплатно вам никто этого не сделает.

sanika 25.05.2012 12:39

Понятно. а сколько может стоить такая работа?:)

Deff 25.05.2012 23:33

Цитата:

Сообщение от sanika (Сообщение 176479)
Можно ли на яваскрипте сделать проверку текста?
Например текст имеет включения - это хорошо, но если есть [IMG]........[/IMG] но не радикал а других хостингов - вывести алерт что есть ошибка. Реально так сделать или javascript не справится с такой задачей?

Что нибудь типо так:
<p id=sanika>dasdas[IMG]http://radikal.ru[/IMG]wqrwe[IMG]http://savepic.ru/[/IMG]53r25r[IMG]http://radikal.ru[/IMG][IMG]http://radikal.ru[/IMG]qw435643</p>
<script type="text/javascript">
//Допустимые Ссылки
var LnkValid = ["radikal.ru","savepic.ru"];

var pattern ="\\[img\\]([^\\]]*)\\[\\/img\\]";
var regexp  = new RegExp(pattern,"img");
alert(regexp)
function ReadErr(){
  alert("!Вставлены не поддерживаемые ресурсом ссылки на изображения.");
}

function bb(str){
  function replacer(str, p1, offset, s){
   var a=false;
    for(var i in LnkValid){
      if(p1.indexOf(LnkValid[i])!=-1){
        a=true;break;
      }
    }
  if(!a){str='[IMG]!!'+p1+'[/IMG]';}
   return str;
  }
  var str2=str.replace(regexp,replacer)
  return str2;
}
// - Тут поместить в переменную str тестируемую строку;
  var str=document.getElementById('sanika').innerHTML

//Результат
  var result=bb(str);
  alert('result:\n'+result)

//Уведомление
  if(result!=str){ReadErr();}
</script>

sanika 26.05.2012 01:48

Спасибо большое! А то начал сам, но вот с регуляркой не мог разобраться. Буду учится дальше. Спасибо!

KOLANICH 31.05.2012 17:36

яваскрипт справится, но такие проверки нужно проводить на сервере

sanika 31.05.2012 20:01

На сервере проверка на PHP сделана. :) Приведенный пример не заработал, я пошел другим путем, правда он не совсем корректно работает
<script language="javascript">
function proverka()
{
var text = document.getElementsByName("message")[0].value;
re  = /\[IMG\](?=http\:\/\/img\.domen\.com\/|http\:\/\/www\.img\.domen\.com\/)(.*)*/i;
re1 = /\[IMG\](.+)*/i;

if ((text.match(re1)) && (!text.match(re)))
{
alert('Есть сторонний фотохостинг');
}else
{
alert('Все отлично');
}

}
</script>
</head>

<body>
<form id="form1" name="form1" method="post" action="#" onsubmit="return proverka() qr_prepare_submit()">
  <table width="100%" border="0" cellpadding="2" cellspacing="2">
    <tbody><tr>
      <td><textarea name="message" cols="60" rows="7" id="message">[IMG]http://domen2.com/images/123.jpg[IMG]</textarea></td>
      <td>&nbsp;</td>
    </tr>
    <tr>
      <td><input name="Submit" value="Submit" onclick="return proverka()" type="submit"></td>
      <td>&nbsp;</td>
    </tr>
  </tbody></table>
</form>


если введены только неверные адреса - срабатывает, если только верные - тоже ок, но если есть и те и другие - говорит что все правильно. а надо наоборот - выводить ошибку, и пока не знаю как ее решить :(

KOLANICH 31.05.2012 20:40

всё очень просто
ты выуди все домены для картинок по регэкспе для любого uri-адреса со скобками на домене и проверь домен по белому списку(нужно циклически вызывать rx.exec и после вызова проверять домен, регулярку лучше создавать в данном случае с использованием new, регулярка для урлов есть в любой базе регулярок)

можно с использованием реплейс, как посоветовал товарищ выше, но это семантически неверно

sanika 31.05.2012 20:43

Спасибо, буду пробовать. к сожалению с яваскриптом я не очень, трудно идет. спасибо за подсказку

Deff 31.05.2012 20:52

sanika,
В исходном скрипте есть
//Допустимые Ссылки
var LnkValid = ["radikal.ru","savepic.ru"];

В Вашем же Варианте - их нет

sanika 31.05.2012 21:09

Стыдно, но этот код очень сложен для меня :(

Deff 31.05.2012 23:01

Цитата:

Сообщение от sanika
но этот код очень сложен для меня

Вам достаточно изменить ссылки на хост.name
var LnkValid = ["radikal.ru","savepic.ru"]; (Можно добавлять/изменять

Код вродь полностью готовый


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