为以下示例提供解决方案,
场景1:
我的字符串:Password={my_pswd}}123}
我想选择{}括号内的值(例如:我想选择完整的密码键值{my_pswd}123}
而不是{my_pswd}
)
如果我正在使用此正则表达式\{(.*?)\}
,则会选择{my_pswd}
而不是{my_pswd}}123}
。那么,即使单词之间有},如何获得完整的单词呢?通过使用正则表达式或其他任何方式给我一些建议。
方案2:
我正在使用此正则表达式^\{|\}$
。如果我的字符串同时具有{
的{{1}}和}
括号,则只有它想选择第一个和最后一个括号。如果我的字符串像这样的{{my_password}}
,则不想选择该起始括号。正则表达式中的AND条件。我提到了许多他们查找的帖子,但我不清楚。给我一些建议。
谢谢。
答案 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+个字符,然后在字符串(}
)的末尾匹配$
。