1

私はC++テンプレート式から抜け出そうとしています。これは、プロパティタイプ、つまりクラスの各単一タイプに格納されているため、タイプから取得します。

`A <B <C <D>>>

単一のタイプA、B、C、Dを抽出して、それらをリストに入れたいと思います。`私はlispで次のコードを書きました。

(if (string-match "\\(\\w+\\)<+\\(\\w+\\)>+$" property-type)
    (progn
      (setq current-include (match-string 1 property-type) )
      (setq current-recursive-property-type (match-string 2 property-type))

ただし、最初の一致(current-include)がCで、残りがDであるため、一致は間違っています。正規表現のエラーは何ですか?

4

2 に答える 2

1

定義上、正規表現は任意の深くネストされたグループを解析できないため、一般に正規表現ではこのタスクは実際には不可能ですが、この特定のケースでは、文字列を文字で分割し、空の部分文字列を削除するふりをすることができ?\<ます?\>

(split-string "A< B < C < D > > >" "\\s-*[,<>]+\\s-*" t)

あなたが望むことをするようです。

また、大量のテキストに対して照合する場合、複数行の式にする必要がある場合、非常に非効率になる可能性が非常に高いことに注意してください。したがって、代わりに次のようなものを使用できます。

(defun parse-c++-types (type)
  (let ((current 0) c types word)
    (while (< current (length type))
      (setq c (aref type current))
      (if (or (char-equal c ?\<) (char-equal c ?\>))
          (when word
            (setq types (cons (coerce word 'string) types)
                  word nil))
        (unless (memberp c '(?\, ?\ ))
          (setq word (cons c word))))
      (incf current))
    (reverse types)))

(parse-c++-types "A< B < C < D > > >")
于 2012-10-09T13:11:08.733 に答える
0

<すべてのクラス名の前に?が付いていると想定するのは正しいでしょうか。もしそうなら、あなたは簡単にマッチすることができます(エスケープされていません)

(\w+)(?:\s*<\s*(\w+))*

単一のクラス名を抽出します。

  • (\w+)ファーストクラスです
  • (?:非捕捉グループです
    • \s*<\s*前後のスペース<
    • (\w+)
    • )*グループが 0 回以上繰り返される

ここでは、名前付きグループを使用してその仕組みを示す例を示します。2 番目のグループは複数一致で、最後のグループは D です。

于 2012-10-09T10:51:32.893 に答える