1

次のような文字列を解析しようとしています。

AxBxCxAxBxCxAxBxCxAxBx...AxBZCx...

どこ

  • リスト項目
  • A は既知の文字列です (「foo」など)
  • B は既知の文字列です (「バー」など)
  • C は既知の文字列です (「baz」など)
  • x は、A、B、または C を含まない 0 個以上の未知の文字のシーケンスです
  • Z は既知の文字列です (「ゴリラ」など)

私が知る必要があるのは、BZC の前に現れる A の出現回数です (1 回以上になります)。Z は任意の x の一部として表示される可能性があるため、B と C の部分は無関係ではありません。

私は正規表現の初心者ですが、これはまさにそのような仕事のようです。ループを含むプログラミング言語の実装 (トークナイザー アルゴリズムなど) は避けたいと思います。

編集: もう少し考えてみると、Z は最初に私が求めていると言ったものですが、本当に重要なのは BZC であることに気付きました。必要なのはその前の A のカウントだけであり、x に A が決して含まれないことを考えると、Z を元の BZC として定義し、次のように問題を単純化できます。

解析する元の文字列: xAxAxAx...Z

ここで、A にも x にも Z が含まれておらず、x には A が含まれていません。Z の前の A のインスタンスの数を探します。

4

4 に答える 4

0
(A)(?=.*?Z)

一致の数はあなたにカウントを与えます。

ここで動作します

ここでは、Aをfooに、ZをGorillaに置き換えることができます。

于 2012-08-28T16:51:56.393 に答える
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(?=.*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 に答える