0

次のような数式を「トークン化」するために使用する正規表現があります。

a + b + 1 + 2

int main() {
    string rxstrIdentifier = "\\b[a-zA-Z]\\w*\\b";
    string rxstrConstant = "\\b\\d+\\b";
    string rxstrRef = "(" + rxstrIdentifier + ")|(" + rxstrConstant + ")"; // identifier or constant

    const regex rxExpr = regex("^(" + rxstrRef + ")(.*)$"); // {x} [{+} {y}]*
    //const regex rxSubExpr = regex("^\\s*([+])\\s*(" + rxstrRef + ")(.*)$"); // {+} {x} [...]

    string test = "b + a + 1";
    cmatch res;
    regex_search(test.c_str(), res, rxExpr);
    cout << "operand: " << res[1] << endl;
    cout << "res: " << res[2] << endl;

    system("pause");
    return 0;
}

問題はオペランドであり、 res は例で b だけを与えます。期待した

operand: b
res: + a + 1

以前は別の同様の正規表現で動作していました...

const regex Parser::rxExpr = regex("^(\\w+)((\\s*([+])\\s*(\\w+))*)$"); // {x} [{+} {y}]*
const regex Parser::rxSubExpr = regex("^\\s*([+])\\s*(\\w+)(.*)$"); // {+} {x} [...]
4

2 に答える 2

1

(?:pattern) グループを使用:

string rxstrRef = "(?:" + rxstrIdentifier + ")|(?:" + rxstrConstant + ")"; // identifier or constant

これにより、検索結果への影響がなくなります

于 2012-11-01T14:09:50.207 に答える
1

あなたの正規表現は、文字列内の空白を許可していないようです。\b単語の境界に一致しますが、境界の幅はゼロであるため、トークン間のスペースは何も消費されません。

于 2012-11-01T14:05:03.410 に答える