Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   регулярки: замена ссылки на ютуб (https://javascript.ru/forum/misc/30183-regulyarki-zamena-ssylki-na-yutub.html)

nerv_ 29.07.2012 12:20

нашел решение :)
Цитата:

Сообщение от melky
написать сюда регу, при которой код бы возвращал то, что указано в комметарии : (флагов нет!)
"я мыл раму мылом, амиго".match(/текст реги/).join(" "); // "я амиго"

alert( "я мыл раму мылом, амиго".match( /^\S+|\S+$/g ).join( " " ) ); // "я амиго"

melky 29.07.2012 12:29

Цитата:

Сообщение от nerv_ (Сообщение 192652)
нашел решение :)

alert( "я мыл раму мылом, амиго".match( /^\S+|\S+$/g ).join( " " ) ); // "я амиго"

без флагов :) в том числе "global"

Hekumok 29.07.2012 17:08

melky, а вы уверены, что 3-ье задание можно выполнить без флагов?

1-ое и 2-ое задание nerv_ уже выполнил, так что не вижу смысла их повторять

Вот 4-ое задание

var pat = /<title>([\S\s]+)<\/title>/i ;

var text = '<title>заголовок</title>' ;

text = text.replace(pat, function(a, b) {return '<div>'+b+'</div>'}) ;

alert (text) ;


Этот код работает ток еси в тексте один тег title. Я не думаю, что нужно, где много тегов title, хотя еси именно это нужно, то воть

var pat = /<title>([\S\s]+?)<\/title>/i ;

var text = '<title>заголовок</title> <title>текст</title>' ;

text = text.replace(pat, function(a, b) {return '<div>'+b+'</div>'}) ;

alert (text) ;

5-ое пока не думал

Dim@ 29.07.2012 17:42

№ 5
function Five(obj, str){
  if (obj == undefined || obj == null || str == undefined || str == null) return; 
  var izm = str;
  for (var i in obj){
    var k = i + "";
    if (typeof obj[k] == "number" || typeof obj[k] == "string"){
     var reg = new RegExp(i, "i", "g");
     str = str.replace(reg, obj[k]);
    }
  }
  alert(izm + "\n" + str);
}
Five({
"Какашка":"Капуста",
"была":"делала",
"в жопе":"какашку",
"lLLL":{}
}, "Какашка была в жопе");

Dim@ 29.07.2012 17:50

Цитата:

Сообщение от Deff (Сообщение 192624)
Hekumok,
Написать функцию транслитерации русского текста - латиницей и наоборот

написать для перевода если вводили текст на русском языке, а раскладка была английская :D

Deff 29.07.2012 18:35

Цитата:

Сообщение от Dim@
написать для перевода если вводили текст на русском языке, а раскладка была английская

Оч часто в чатах и форумах - пример
Z njhjgk.cm e,tuf. yf hf,jne dtxthjv ,ele d bytnt b dc` hfccrf;e gjlhj,ytt

Dim@ 29.07.2012 18:37

Deff,
да, очень часто - надо написать такую функцию - эх только впадлу мне, впадлу :p

Hekumok 29.07.2012 19:28

Deff, русский->английский
var pat = /\S/img ;
var text = 'а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ы ь э ю я' ;
text = text.replace(pat, function(a) {
if (a=='а') return 'a' ;
if (a=='б') return 'b' ;
if (a=='в') return 'v' ;
if (a=='г') return 'g' ;
if (a=='д') return 'd' ;
if (a=='е'||a=='э') return 'e' ;
if (a=='ё') return 'yo' ;
if (a=='ж') return 'zh' ;
if (a=='з') return 'z' ;
if (a=='и'||a=='й') return 'i' ;
if (a=='к') return 'k' ;
if (a=='л') return 'l' ;
if (a=='м') return 'm' ;
if (a=='н') return 'n' ;
if (a=='о') return 'o' ;
if (a=='п') return 'p' ;
if (a=='р') return 'r' ;
if (a=='с') return 's' ;
if (a=='т') return 't' ;
if (a=='у') return 'u' ;
if (a=='ф') return 'f' ;
if (a=='х') return 'h' ;
if (a=='ц') return 'ts' ;
if (a=='ч') return 'ch' ;
if (a=='ш') return 'sh' ;
if (a=='щ') return 'sch' ;
if (a=='ы') return 'y' ;
if (a=='ь') return "'" ;
if (a=='ю') return 'yu' ;
if (a=='я') return 'ya' ;
}) ;
alert (text) ;

Hekumok 29.07.2012 20:00

Deff, Dim@, ну 'написать для перевода если вводили текст на русском языке, а раскладка была английская' нун делать также как и предыдущий пост, неохота писать...
А 5 задачу Dim@ уже сделал...
И мне кажется, что 3-ью задачу низзя сделать без флагов

melky 29.07.2012 20:50

Цитата:

Сообщение от Dim@ (Сообщение 192699)
№ 5
function Five(obj, str){
  if (obj == undefined || obj == null || str == undefined || str == null) return; 
  var izm = str;
  for (var i in obj){
    var k = i + "";
    if (typeof obj[k] == "number" || typeof obj[k] == "string"){
     var reg = new RegExp(i, "i", "g");
     str = str.replace(reg, obj[k]);
    }
  }
  alert(izm + "\n" + str);
}
Five({
"Какашка":"Капуста",
"была":"делала",
"в жопе":"какашку",
"lLLL":{}
}, "Какашка была в жопе");

как сложно. всё проще :
function Five (obj, str) {
    return str.replace(/[a-zа-я]+/ig, function (word) {
        return word in obj ? obj[word]:word;
    });
}

alert( Five({
    "заяц": "петя",
    "крыльцо": "стрельцов"
}, "вышел заяц на крыльцо"));


Цитата:

Сообщение от Hekumok
А 5 задачу Dim@ уже сделал...

я ж Вам задачи дал, а не всем :)

Цитата:

Сообщение от Hekumok
И мне кажется, что 3-ью задачу низзя сделать без флагов

сдаётесь? сделать можно, и очень просто. учите реги :)

Dim@ 29.07.2012 21:08

melky,
я не понял 3-ю задачу :blink: надо узнать что идет после
var txt = "txt";//fds
?

Hekumok 29.07.2012 21:12

Цитата:

Сообщение от melky (Сообщение 192744)
я ж Вам задачи дал, а не всем :)

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

Сообщение от melky (Сообщение 192744)
сдаётесь? сделать можно, и очень просто. учите реги :)

Нет, буду думать :)

Hekumok 29.07.2012 21:15

Цитата:

Сообщение от Dim@ (Сообщение 192747)
melky,
я не понял 3-ю задачу :blink: надо узнать что идет после
var txt = "txt";//fds
?

В третьей задачи нет такого :blink:

oneguy 29.07.2012 21:36

Решение 3 задачи:
alert("я мыл раму мылом, амиго".match(/я(?=.*(амиго))/).join(" "));

Deff 29.07.2012 21:53

Цитата:

Сообщение от Hekumok
Deff, русский->английский

<script type="text/javascript">

function LatRus(TxtTrans1,a){TxtTrans1=='lat'? TxtTrans1='rus':TxtTrans1='lat';
lat0='qwertyuiopasdfghjkl;\'zxcvbnm\,QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>`~[].'.split('');
lat='qwertyuiopasdfghjkl;\'zxcvbnm\,QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>`~'.split('');
lat.push('\\[');lat.push('\\]');lat.push('\\.');
rus=('йцукенгшщзфывапролджэячсмитьбЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёЁхъю').split('');
function transF(p){ar1=lat;ar2=rus;if(TxtTrans1=='lat'){ar2=lat0;ar1=rus}for(var i=0; i<ar1.length; i++){trans='/'+ar1[i]+'/gm';p=p.replace(eval(trans), ar2[i])}return p;} return transF(a)}


*!*
var a='Z njhjgk.cm e,tuf. yf hf,jne dtxthjv ,ele d bytnt b dc` hfccrf;e gjlhj,ytt\n\
Z тороплюсь e,tuf. на работу dtxthjv буду d bytnt b всё расскажу gjlhj,ytt'
*/!*


alert(LatRus('lat',a))
</script>

oneguy 29.07.2012 22:05

Задача.
Функция принимает 2 натуральных числа, не больше 0xFFFFFFFE и возвращает наибольший общий делитель этих чисел. Дана заготовка этой функции.
function gcd(m, n) {
  return (Array(m+1).join("*")+","+Array(n+1).join("*")).match(регулярка)[0].length;
}

Нужно вставить вместо "регулярка" регулярный литерал без флагов, так, чтобы функция выполняла своё задание.
Регулярный литерал должен быть длиной не более 256 символов. Считается, что имеется бесконечное количество памяти и времени во время выполнения задания.

Dim@ 29.07.2012 22:08

выложу то что не лень было решить ;)
1)
function prov(txt){
 if (!/[^a-zA-z]+/ig.test(txt)) if (txt.length < 15) return true; else return false;
 else return false;
}
alert(prov("БЛАLl"));
alert(prov("prov"));

2)
function prov(txt){
 if (/((\s)|(\S))\1/ig.test(txt)) return true;
 else return false;
}
alert(prov("Я пил яггу"));
alert(prov("я пил ягу"));

4)
function prov(txt){
 txt = txt.replace(/(<title>.+<\/title>)/ig, function (e){
  return e.replace(/(title)/ig, "div");
 });
 return txt;
}
alert(prov("<title>Я див</title>"));

Hekumok 29.07.2012 22:21

Цитата:

Сообщение от oneguy (Сообщение 192754)
Решение 3 задачи:
alert("я мыл раму мылом, амиго".match(/я(?=.*(амиго))/).join(" "));

:blink: я не знал, что так можно :lol:
Цитата:

Сообщение от Deff (Сообщение 192756)
<script type="text/javascript">

function LatRus(TxtTrans1,a){TxtTrans1=='lat'? TxtTrans1='rus':TxtTrans1='lat';
lat0='qwertyuiopasdfghjkl;\'zxcvbnm\,QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>`~[].'.split('');
lat='qwertyuiopasdfghjkl;\'zxcvbnm\,QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>`~'.split('');
lat.push('\\[');lat.push('\\]');lat.push('\\.');
rus=('йцукенгшщзфывапролджэячсмитьбЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёЁхъю').split('');
function transF(p){ar1=lat;ar2=rus;if(TxtTrans1=='lat'){ar2=lat0;ar1=rus}for(var i=0; i<ar1.length; i++){trans='/'+ar1[i]+'/g';p=p.replace(eval(trans), ar2[i])}return p;}a=a.split('');for(j in a){a[j]=transF(a[j])}return a.join('');}


*!*
var a='Z njhjgk.cm e,tuf. yf hf,jne dtxthjv ,ele d bytnt b dc` hfccrf;e gjlhj,ytt'
*/!*


alert(LatRus('lat',a))
</script>

Честно, нифига не понял
Цитата:

Сообщение от oneguy (Сообщение 192757)
Задача.
Функция принимает 2 натуральных числа, не больше 0xFFFFFFFF и возвращает наибольший общий делитель этих чисел. Дана заготовка этой функции.
function gcd(m, n) {
  var str="";
  for (var i=0; i<m; i++)
    str+="*";
  str+=",";
  for (i=0; i<n; i++)
    str+="*";
  return str.match(регулярка)[0].length;
}

Нужно вставить вместо "регулярка" регулярный литерал без флагов, так, чтобы функция выполняла своё задание.

А что значит 'не больше 0xFFFFFFFF'? Это скока?

nerv_ 29.07.2012 22:32

Цитата:

Сообщение от melky
без флагов в том числе "global"

ты не понял :) Мое решение заключалось в (флагов нет!)

oneguy, не?
function gcd( m, n ) {
	var str = new Array( m + 1 ).join( '*' ) + ',' + new Array( n + 1 ).join( '*' );
	return str.match( /регулярка/ )[ 0 ].length;
}

oneguy 29.07.2012 22:35

Цитата:

Сообщение от Hekumok
А что значит 'не больше 0xFFFFFFFF'? Это скока?

Это шестнадцатеричный литерал, со значением 4294967295, или Math.pow(2, 32)-1.

oneguy 29.07.2012 22:36

Цитата:

Сообщение от nerv_
oneguy, не?

А где регулярка?

oneguy 29.07.2012 22:39

Цитата:

Сообщение от oneguy
Регулярный литерал должен быть длиной не более 256 символов.

Добавил это условие, а то без него уж слишком просто :)
Цитата:

Сообщение от oneguy
Считается, что имеется бесконечное количество памяти и времени во время выполнения задания.

Ещё это условие для ясности.

oneguy 29.07.2012 23:07

Цитата:

Сообщение от nerv_
oneguy, не?

Да, спасибо, так задача звучит изящнее. Переформулировал задачу. Хотя это через Array и join выполняется медленнее.

melky 29.07.2012 23:15

Цитата:

Сообщение от oneguy (Сообщение 192754)
Решение 3 задачи:
alert("я мыл раму мылом, амиго".match(/я(?=.*(амиго))/).join(" "));

так не интересно :victory:


Цитата:

Сообщение от oneguy (Сообщение 192757)
Задача.
Функция принимает 2 натуральных числа, не больше 0xFFFFFFFE и возвращает наибольший общий делитель этих чисел. Дана заготовка этой функции.
function gcd(m, n) {
  return (Array(m+1).join("*")+","+Array(n+1).join("*")).match(регулярка)[0].length;
}

Нужно вставить вместо "регулярка" регулярный литерал без флагов, так, чтобы функция выполняла своё задание.
Регулярный литерал должен быть длиной не более 256 символов. Считается, что имеется бесконечное количество памяти и времени во время выполнения задания.

подумаю, но не завтра и не сегодня. день рождения у меня :p

Deff 29.07.2012 23:24

melky,

nerv_ 29.07.2012 23:28

melky, с днем варенья ) Успехов в начинаниях, здоровья :) Я сегодня тоже на дне рождении присутствовал у друга )

oneguy 29.07.2012 23:32

melky, поздравляю с днём рожденья!

Hekumok 29.07.2012 23:49

melky, с днем рожденья)))
oneguy, буду думать)))

Dim@ 30.07.2012 16:19

melky,
с днем рождения! :victory:

Hekumok 30.07.2012 17:58

Цитата:

Сообщение от oneguy (Сообщение 192757)
Задача.
Функция принимает 2 натуральных числа, не больше 0xFFFFFFFE и возвращает наибольший общий делитель этих чисел. Дана заготовка этой функции.
function gcd(m, n) {
  return (Array(m+1).join("*")+","+Array(n+1).join("*")).match(регулярка)[0].length;
}

Нужно вставить вместо "регулярка" регулярный литерал без флагов, так, чтобы функция выполняла своё задание.
Регулярный литерал должен быть длиной не более 256 символов. Считается, что имеется бесконечное количество памяти и времени во время выполнения задания.

Не, всё я сдаюсь, перепробовал всё, до чего додумался... Слишком сложная для меня

melky 30.07.2012 18:30

Цитата:

Сообщение от Deff (Сообщение 192776)
melky,

Цитата:

Сообщение от nerv_ (Сообщение 192779)
melky, с днем варенья ) Успехов в начинаниях, здоровья :) Я сегодня тоже на дне рождении присутствовал у друга )

Цитата:

Сообщение от oneguy (Сообщение 192780)
melky, поздравляю с днём рожденья!

Цитата:

Сообщение от Dim@ (Сообщение 192968)
melky,
с днем рождения! :victory:

фак еах, спасибо вам всем, ребята!"!!!!1

Dim@ 30.07.2012 20:53

oneguy,
блин я замучался так как сделать такую регу? :blink:
Просвети нас о Великий :D !!!

Hekumok 30.07.2012 22:56

Цитата:

Сообщение от Dim@ (Сообщение 193049)
oneguy,
блин я замучался так как сделать такую регу? :blink:
Просвети нас о Великий :D !!!

Дааа! :D ждем-с...

oneguy 30.07.2012 23:52

Так что? Все уже сдались? Показать решение?

Hekumok 31.07.2012 00:02

Цитата:

Сообщение от oneguy (Сообщение 193106)
Так что? Все уже сдались? Показать решение?

Да, давай! А то у мну уже мозги кипят - я чё ток не пробовал уже...

oneguy 31.07.2012 00:03

Ладно, подсказка:
(спойлер)

Вы помните, что в регулярках можно использовать обратные ссылки? Например, можно проверить, не стоят ли вконце строки те же 5 символов, что и вначале:
/^([\s\S]{5})[\s\S]*\1$/

(конец спойлера)
Может после этой подсказки кто-то решит?

Hekumok 31.07.2012 00:12

[убрал]
Но решения я всё равно не знаю -.-

oneguy 31.07.2012 00:20

Цитата:

Сообщение от Hekumok
Но решения я всё равно не знаю -.-

Показать решение или хотите подумать?
Может быть, лучше спрячьте спойлер, а то melky ещё хотел подумать?

Hekumok 31.07.2012 00:44

oneguy, убрал

Hekumok 31.07.2012 00:47

oneguy, Решение не показывайте пока - я завтра еще подумаю, да и melky хотел...P.S. но я не думаю, что у мну получится найти решение...


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