2013-12-24 6 views
1

Я хочу проверить строку и, после этого, получить все совпадения от некоторых групп.Получить соответствия от определенных групп

RegEx:

/^<[A-Za-z0-9]>::=(<[A-Za-z0-9]>)+(\|(<[A-Za-z0-9]>)+)+$/ 

Так что, если я получаю что-то вроде <A>::=<B><A>|<Y><A>|<Z> справедливо, но если я получаю что-то вроде <A>::=<B>| ложно.

Нет проблем с проверкой, проблема в том, что я хочу взять текст внутри < и >, потому что мне это нужно позже.

Так что, если я получаю <exparit>::=<number>|<number><exparit>, то я хочу, чтобы получить ["exparit", "number", "number", "exparit"]

Мой код выглядит

Rules = { 
    "BNF" : /^<[A-Za-z0-9]>::=(<[A-Za-z0-9]>)+(\|(<[A-Za-z0-9]>)+)+$/ 
}; 

var checkBNF = function (bnf) { 
    if (Rules.BNF.test(bnf)) { 
    console.log('ok'); 
    //How to get the text inside <and> ?? 
    } 
    else { 
    console.log('no'); 
    } 
}; 

Я действительно ценю любую помощь, такую ​​книгу, ссылку, пример или разрешение этой проблемы.

Спасибо!

ответ

2

Если я могу помочь вам немного, вот что-то стат с:

http://jsfiddle.net/URLhb/1/

var test = "<A>::=<B><A>|<Y><A>|<Z>"; 

var patt0 = /<([a-zA-Z]*)>/g; //Old and bad version 
var patt1 = /[a-zA-Z]+/g; 

var testRE = test.match(patt1); 



alert(testRE[0]); 
alert(testRE[1]); 
alert(testRE[2]); 
alert(testRE[3]); 
alert(testRE[4]); 
alert(testRE[5]); 

Этот код будет захватывать текст внутри <>, но и < и> символы с ним , Я пытаюсь это исправить, я обновлю, если получаю лучший результат.

EDIT: нашел проблему: я использовал * вместо +! Теперь он отлично работает!

1

То, что я был немного отличается, поскольку я не был уверен, что вы только когда-либо [A-Za-z0-9] в <>

Rules = { 
    "BNF" : /^<[A-Za-z0-9]>::=(<[A-Za-z0-9]>)+(\|(<[A-Za-z0-9]>)+)+$/ 
}; 

var checkBNF = function (bnf) { 
    if (Rules.BNF.test(bnf)) { 
    console.log('ok'); 

    //How to get the text inside <and> ?? 
    var patt = /\<(.*?)\>/g; 
    var strArray = bnf.match(patt); 
    for (i=0;i<strArray.length;i++) { 
     strArray[i] = strArray[i].replace('<','').replace('>',''); 
    } 
    return strArray; 
    } 
    else { 
    console.log('no'); 
    } 
}; 

var test = "<A>::=<B><A>|<Y><A>|<Z>"; 
var result = checkBNF(test); 
console.log(result) 

http://jsfiddle.net/UmT3P/

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