2017-09-06 73 views
0

我想用pcre2來匹配字符串。 例如,我有幾個字符串模式,「a」,「b」,「c」,「d」和「e」。 我有一個長文字「str」匹配。 現在我構造一個模式「a | b | c | d | e」以匹配「str」使用pcre2_match。 如何知道哪種模式匹配? 我只想得到匹配的模式編號,而不是「a」或「b」,因爲我不想將匹配的模式與「a」,「b」,「c」,「d」,「e」 「再次。如何在pcre2中得到匹配的組號碼

回答

0

假設你直接使用PCRE2庫,並已獲得其所有功能,您有此幾種解決方案,從最簡單到最複雜:

  • 使用編號的捕獲組:(a)|(b)|(c)|(d)
  • 使用命名捕獲組:(?<a>a)|(?<b>b)|(?<c>c)|(?<d>d)
  • 使用marksa(*MARK:a)|b(*MARK:b)|c(*MARK:c)|d(*MARK:d)
  • 使用:a(?C{a})|b(?C{b})|c(?C{c})|d(?C{d})
  • 如果你真的不能修改你的輸入模式,使用PCRE2_AUTO_CALLOUT並找到了一些方法來映射模式偏移分支,然後rememeber比賽
+0

結束前的最後一個模式偏置看到通過使用編號的捕獲(a)|(b)|(c)|(d),我怎樣才能得到匹配組的數量?它存儲在哪裏? – johnhypo

+0

@johnhypo它在[匹配數據塊](http://pcre.org/current/doc/html/pcre2api.html#SEC27)中,更確切地說在* ovector *中。閱讀它[這裏](http://pcre.org/current/doc/html/pcre2api.html#SEC30)。如果ovector [2 * n]!= PCRE2_UNSET',您可以判斷捕獲組編號** n **是否匹配。 ** n **從1開始,因爲索引0表示完整模式。或者,您可以使用「pcre2_match」的返回值,它是已設置的最高捕獲組編號。 –

+0

稍作修改:'pcre2_match'的返回值是** 1 + **最高的捕獲組編號。 –