1

希望解析这样的字符串:

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

4 回答 4

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

var CountNumA = TextBeforeFirstZ.match(/A/g).length
于 2012-09-05T01:14:07.860 回答
0
A(?:.(?!A|B|C))*?.BZC

试试看。逻辑是:

A

匹配A(清楚)

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

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

*?

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

.BZC

匹配任意字符(组不匹配,因为后面跟着B),然后是BZC

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

于 2012-08-28T17:41:52.067 回答
0
(A)(?=.*?Z)

匹配数为您提供计数。

在这里工作

在这里,您可以用 foo 替换 A,用 Gorilla 替换 Z。

于 2012-08-28T16:51:56.393 回答
0

这就是我所做的:

(A(?=.*BZC))

全面测试:

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

alert(b.length);

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

于 2012-08-28T17:47:37.720 回答