使用RegEx确定出现在另一个序列之前的序列的出现次数

时间:2012-08-28 16:32:25

标签: regex

想要解析这样的字符串:

... AxBxCxAxBxCxAxBxCxAxBx ... AxBZCx

其中

  • 列表项
  • A是已知的字符序列(如'foo')
  • B是已知的字符序列(如'bar')
  • C是已知的字符序列(如'baz')
  • x是零个或多个未知字符的序列,不包含A,B或C
  • Z是已知的字符序列(如'Gorilla')

我需要知道的是在BZC之前出现的A的出现次数(将是1或更多)。 B和C部分不是无关的,因为Z可能表现为任何x的一部分。

我是正则表达式的新手,但这似乎只是它的工作。我宁愿避免涉及循环的编程语言实现(如标记化算法)。

修改的: 在考虑了一点之后,我意识到虽然Z是我最初说的,但我真正重要的是BZC。鉴于我所需要的只是之前的A计数,并且x将永远不会包含A,我可以将Z定义为原始BZC并简化问题:

要解析的原始字符串:xAxAxAx ... Z

其中A和x都不包含Z,x不包含A.在Z之前查找A的实例计数。

4 个答案:

答案 0 :(得分:0)

(A)(?=.*?Z)

匹配次数为您提供了计数。

作品here

这里你可以用大猩猩替换A和foo和Z.

答案 1 :(得分:0)

A(?:.(?!A|B|C))*?.BZC

试试吧。逻辑是:

A

匹配A(清楚)

(?:.(?!A|B|C))

匹配匹配的字符后面没有A,B或C(不捕获它)(?:...)是一个“非捕获”组,这意味着您的解析器不会单独存储它。和(?!...)是一个负前瞻,一个零宽度断言,它将检查前面的字符,并确保它们与正则内的正则表达式不匹配,而不实际匹配任何字符。

*?

这是任意次数(懒惰 - 满足要求的最短字符串。)

.BZC

匹配一个任意字符(由于它后跟B,因此不会与该组匹配),然后是BZC

这不是最有效的正则表达式,但它应该完成这项工作

答案 2 :(得分:0)

这就是我所做的:

(A(?=.*BZC))

完整测试:

var a = $('p').text();
var b = a.match(/(A(?=.*BZC))/g);

alert(b.length);

示例: http://jsfiddle.net/7vkzF/1/

答案 3 :(得分:0)

var TextBeforeFirstZ = string.split(/Z/)[0]

var CountNumA = TextBeforeFirstZ.match(/A/g).length