Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Такое regExp (https://javascript.ru/forum/misc/39804-takoe-regexp.html)

lancer 12.07.2013 18:21

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

Дано: произвольная строка.
Искомое совпадение: символы A, B, C присутствующие одновременно.

А и B я еще найти могу.
a = "qwertyqwerBtCyA";
a_reg = /A.*?B|B.*?A/i;


Но если в искомые добавить C, то прийдется таких "или" плодить 8 штук.

Для проверки последовательности (C)A(C)B.
a_reg = /CA.*?B|AC.*?B|C.*?A.*?B|A.*?C.*?B/i;

Для части (C)B(C)A будет почти тоже.

Казалось бы сошло как никак для трех букв. А если их 8, то решение будет явно громоздкое.

mta88 12.07.2013 18:26

так регулярные выражения не всесильны
а главное при увеличении размера становятся нечитаемы
а для вашей задачи проверки вхождения букв я бы использовал indexOf уже с количества букв равного 1 (один, да с одной буквы)

edison 12.07.2013 20:21

У вас пример высосанный из пальца и соответсвтенно решение его тоже высосано из пальца, т.е. решается такое совсем не регулярками.
Никто не мешает сделать 2,3 - 10 регулярок и проверять
a_reg1 = /C/;
a_reg2 = /B/;
a_reg3 = /A/;

if(a_reg1&&a_reg2&&a_reg3) - упростил конечно, но думаю смысл понятен

Опять же пример высосан из пальца и он не решается регекспами.

pikko 12.07.2013 21:55

var s = 'qwertyqwerBtCyA';

function miracle ( s, r ) {
    for (var i = r.length; i;) if (!r[--i].test(s)) return false;
    return true;
}

alert(  miracle( s, [ /A/, /B/, /C/ ] ) );

Deff 13.07.2013 07:02

http://javascript.ru/basic/regular-e...n#obekt-regexp

function allSumb_test(str){
  var arr = ['A','B','C','D'];
  for(var i=0;i<arr.length; i++) {
    var re = new RegExp(arr[i], "i");
    if(!re.test(str))   return false;    
  }
    return true;
}
var str = "qwertyqwerBtCyAsdfsd"; //Тест со всеми в массиве;
alert(allSumb_test(str))

var str = "qwertyqwerBtCyAs"; //Тест без D/d
alert(allSumb_test(str))


Или

function allSumb_test(str){
  var arr = 'ABCD'.split('');
  for(var i=0;i<arr.length; i++) {
    if(str.indexOf(arr[i])==-1 && str.indexOf(arr[i].toLowerCase())==-1)   return false;    
  }
  return true;
}
var str = "qwertyqwerBtCyAsdfsd"; //Тест со всеми в массиве;
alert(allSumb_test(str))

var str = "qwertyqwerBtCyAs"; //Тест без D/d
alert(allSumb_test(str))

Aetae 14.07.2013 07:57

Ну если очень захотеть - можно поизвращаться :D :
alert(

/([ABC]).*(?!\1)([ABC]).*(?!\1|\2)[ABC]/

.test(prompt('test string', '4 B 5345 A dfdf  #$@% C fdhd')))


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