2013-12-16 4 views
-2

Я ужасен в регулярном выражении. Пожалуйста, пожалейте и протяните мне руку. Я пытаюсь разбить строку на первое вхождение And (с учетом регистра), в массив с длиной 2. Я понятия не имел, чтобы начать, так может кто-нибудь мне помочь?Regex: split string, основанный на первом вхождении, с возникновением

var strArr = "Thing And other thing".split(/magic regex/); 
expect(strArr).to.deep.equal(["Thing","And other thing"]); 

var strArr = "Thing and other thing".split(/magic regex/); 
expect(strArr).to.deep.equal(["Thing and other thing", ""]); 

var strArr = "One Thing And other thing And yet another thing".split(/magic regex/); 
expect(strArr).to.deep.equal(["One Thing","And other thing And yet another thing"]); 

var strArr = "yep, just one thing".split(/magic regex/); 
expect(strArr).to.deep.equal(["yep, just one thing", ""]); 

UPDATE это работает именно так, как мне нужно, чтобы он, но его все некрасиво:

parser = function(str) { 
    var spl; 
    spl = str.split(/\s(?=And)/); 
    if (spl.length > 1) { 
     spl = [spl.shift(), spl.join(" ")]; 
    } else { 
     spl = [str, '']; 
    } 
    return spl; 
    }; 
+0

Вы попробовали просто 'string.split ('And')'? – adeneo

+1

Чтобы просто проверить наличие строки в строке, вы можете использовать indexOf – adeneo

+0

Да. Он не выполняет все модульные тесты. – Fresheyeball

ответ

3

Для этого нет необходимости в регулярном выражении. Просто получить первый индекс "And" в строке:

var i = str.indexOf("And"); 
var strArr; 
if (i == -1) { 
    strArr = [ str ]; 
} else { 
    strArr = [ str.substr(0, i), str.substr(i) ]; 
} 
+1

Хотя это также найдет 'BAnd' – anubhava

+0

Нет ли способа сделать это более элегантно с регулярным выражением? – Fresheyeball

+2

@anubhava: вы можете искать '' и '', если хотите, но вопрос не указал, что он должен искать только« И », это отдельное слово. – Guffa

0

Я предлагаю сделать простой split затем проверить, если массив имеет один или 2

strArr.split("And", 2).length;

+1

Я не думаю, что это приведет к желаемому результату. О параметре 'limit': *« Метод split по-прежнему расщепляется на каждое соответствие 'separator', но он обрезает возвращаемый массив не более, чем' limit'. * Https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Global_Objects/String/split –

+0

Это не работает. – Fresheyeball

2

Хотя метод Guffa работает, если вы в конечном итоге нужно сделать это регулярное выражение так, следующие будут работать (через положительный предпросмотр):

var str = "Thing And other thing"; 
var spl = str.split(/\s(?=And\s)/); 
if (spl.length > 1) 
    spl = [spl.shift(), spl.join(" ")]; 

Чтобы проверить:

alert(JSON.stringify(spl)); 

jsFiddle

Обновлено, чтобы обеспечить его разделение на [space]And[space]

+1

Но это расщепляется в каждом случае не только на первом. –

+1

@FelixKling Правильно, исправил. – brandonscript

+0

Если нет '' And'', это возвращает массив из 2 с '[0]' '' '' ''' – Fresheyeball

Смежные вопросы