即使单词中有括号,如何选择括号中的完整单词

时间:2018-06-28 11:06:02

标签: c++ regex

为以下示例提供解决方案,

场景1:

我的字符串:Password={my_pswd}}123}

我想选择{}括号内的值(例如:我想选择完整的密码键值{my_pswd}123}而不是{my_pswd}

如果我正在使用此正则表达式\{(.*?)\},则会选择{my_pswd}而不是{my_pswd}}123}。那么,即使单词之间有},如何获得完整的单词呢?通过使用正则表达式或其他任何方式给我一些建议。

方案2: 我正在使用此正则表达式^\{|\}$。如果我的字符串同时具有{的{​​{1}}和}括号,则只有它想选择第一个和最后一个括号。如果我的字符串像这样的{{my_password}},则不想选择该起始括号。正则表达式中的AND条件。我提到了许多他们查找的帖子,但我不清楚。给我一些建议。

谢谢。

1 个答案:

答案 0 :(得分:1)

似乎要匹配的{...}子字符串必须紧跟;或字符串末尾。 如果值中的}后面也可以加上;,则无法使用此方法。

您可以通过添加(?![^;])环顾四周来解决第一个问题:

\{(.*?)\}(?![^;])

请参见regex demo

详细信息

  • \{-一个{字符
  • (.*?)-组1:尽可能少包含0个字符
  • \}-一个}字符
  • (?![^;])-当前位置之后,除;之外,不允许其他字符

请参见C++ demo

#include <iostream>
#include <vector>
#include <regex>

int main() {
    const std::regex reg("\\{(.*?)\\}(?![^;])");
    std::smatch match;
    std::string s = "Username={My_{}user};Password={my_pswd}}123}}}kk};Password={my_pswd}}123}";
    std::vector<std::string> results(
        std::sregex_token_iterator(s.begin(), s.end(), reg, 1), // See 1, it extracts Group 1 value
        std::sregex_token_iterator());
    for (auto result : results)
    {
        std::cout << result << std::endl;
    }
    return 0;
}

输出:

My_{}user
my_pswd}}123}}}kk
my_pswd}}123

对于第二种情况,您可以使用

std::regex reg("^\\{([^]*)\\}$");
std::string s = "{My_{}user}";
std::cout << regex_replace(s, reg, "$1") << std::endl; // => My_{}user

请参见another C++ demo

\{([^]*)\}$模式在字符串的开头({)与^匹配,然后匹配并捕获到第1组(后来在$1的帮助下进行引用) (在替换模式中)尽可能多的0+个字符,然后在字符串(})的末尾匹配$