- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在我的 C++ 应用程序中使用正则表达式来测试字符串是否匹配常见的数组类型格式。该字符串应匹配由逗号分隔的数字列表,由任意数量的空白字符包围并由大括号括起来。所以,
{1, 2, 3}`,
{12.234,2313.4231,
{+1.232, -2313.32, 12}
应该都匹配正确。我当前的正则表达式字符串是这样的(为清楚起见添加了空格):
\\{ ( \\s*?[+-]?[0-9]+\\.?[0-9]?,\\s*? )+ \\}
这个字符串的问题是逗号是必需的在每个数字之后,以便被认为是一个有效的字符串。也就是说,字符串 {12, 12, 12,}
有效,但字符串 {12, 12, 12}
不匹配,因为缺少最后一个逗号。我可以通过在逗号后面包含 ?
来使逗号可选,但这会使字符串 {12 12 12}
有效,我想避免这种情况。
我应该如何使逗号字符仅在字符串中最后出现时可选?
这是一个代码片段来说明我的问题:
#include <iostream>
#include <string>
#include <regex>
int main()
{
std::regex test("\\{(\\s*?[+-]?[0-9]+\\.?[0-9]?,\\s*?)+\\}");
std::string input;
while(1){
std::getline(std::cin, input);
if(input == "exit")
break;
if(std::regex_match(input, test))
std::cout << "string matches" << std::endl;
else
std::cout << "string does not match" << std::endl;
}
}
最佳答案
如果你在顶部提到的三个字符串是有效的({1, 2, 3}
, {12.234,2313.4231,}
and {+1.232 , -2313.32, 12}
) 您可以使用两种方法:一种具有积极前瞻性的交替,检查末尾是否有 }
((?:,\\s*|(?=\\}$))
)
std::regex test("\\{(?:\\s*[+-]?[0-9]+\\.?[0-9]*(?:,\\s*|(?=\\}$)))+\\}");
或在最后一个 之前添加一个可选的逗号
,?
:
std::regex test("\\{\\s*[+-]?[0-9]+\\.?[0-9]*(?:,\\s*[+-]?[0-9]+\\.?[0-9]*)*\\s*,?\\}");
参见 regex demo 1和 regex demo 2 .
如果 {1, 2, 3,}
无效,最好的方法是展开重复组:
std::regex test("\\{\\s*[+-]?[0-9]+\\.?[0-9]*(?:,\\s*[+-]?[0-9]+\\.?[0-9]*)*\\s*\\}");
参见 this regex demo .
关于c++ - 仅在捕获组的最后一次出现时使字符可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55554037/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!