0

ファイルにセクションがあります:

[Source]

[Source.Ia32]


[Source.Ia64]

式を次のように作成しました。

const boost::regex source_line_pattern ("(ソース)(.*?)");

今、文字列を一致させようとしていますが、一致できません。常に 0 を返します。

if (boost::regex_match ( sToken, source_line_pattern ) )
  return TRUE;

sToken 値は [Source] であることに注意してください。[Source.Ia32]...などなど。

ありがとう、

4

2 に答える 2

2

コードには少なくとも 2 つの問題があります。まず、指定した正規表現にはリテラル文字列が含まれており、 一致しようとしているように見えるものでは"Sources"ありません。"Source"2 つ目はboost::regex_matchバインドされていることです。文字列全体と一致する必要があります。あなたが望んでいるように見えるのはboost::regex_search. ただし、何をしているかによっては、文字列全体を一致させる方がよい場合があります: "\\[Source(?:\\.(\\w+))?\\]\\s*". これは、存在する場合、末尾部分のキャプチャを提供します(ただし、先頭部分ではありません "Source"---一般に、定数である何かをキャプチャすることには意味がありません)。

".*?"シーケンスが非常に疑わしいことにも注意してください。通常、(エスケープされていない) '*'a の後に'?'.

于 2013-06-17T13:59:42.807 に答える
1

問題は、boost::regex_match入力文字列全体が正規表現と一致する場合にのみ true を返すことです。したがって、「[」と「]」は現在の正規表現と一致せず、失敗します。

オプションはboost::regex_search、正規表現に一致する入力の部分文字列を検索する を使用するか、渡される文字列全体を受け入れるように正規表現を変更するかのいずれかです。

于 2013-06-17T13:50:42.930 に答える