获取特定组的匹配项

时间:2013-12-24 08:21:50

标签: javascript regex match

我想验证一个String,之后,获取一些组的所有匹配。

正则表达式:

/^<[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 个答案:

答案 0 :(得分: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]);

此代码将捕获&lt;中的文本。 &gt;,而且&lt;和&gt;与它的符号。我正试图解决这个问题,如果我得到更好的结果,我会更新。

编辑:发现问题:我使用的是*而不是+!它现在完美运作了!

答案 1 :(得分: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/