想要解析这样的字符串:
... AxBxCxAxBxCxAxBxCxAxBx ... AxBZCx
其中
我需要知道的是在BZC之前出现的A的出现次数(将是1或更多)。 B和C部分不是无关的,因为Z可能表现为任何x的一部分。
我是正则表达式的新手,但这似乎只是它的工作。我宁愿避免涉及循环的编程语言实现(如标记化算法)。
修改的: 在考虑了一点之后,我意识到虽然Z是我最初说的,但我真正重要的是BZC。鉴于我所需要的只是之前的A计数,并且x将永远不会包含A,我可以将Z定义为原始BZC并简化问题:
要解析的原始字符串:xAxAxAx ... Z
其中A和x都不包含Z,x不包含A.在Z之前查找A的实例计数。
答案 0 :(得分:0)
答案 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);
答案 3 :(得分:0)
var TextBeforeFirstZ = string.split(/Z/)[0]
var CountNumA = TextBeforeFirstZ.match(/A/g).length