使用正则表达式搜索从C+中的XML文件中查找并输出6个特定的时间戳+; 本周末,我一直试图熟悉ReGEX,意图将其实现为C++程序,以提取并不仅将它们输出到控制台窗口,而且将它们输出到简单的输出文本文件。以下是我到目前为止收集到的信息。但是,我下面的内容只将第一个时间戳打印到控制台窗口,并且也只将第一个时间戳打印到输出文件,而忽略其他5个时间戳。有人能帮我找到哪里出了问题吗?在上进行测试后,正则表达式可以工作

使用正则表达式搜索从C+中的XML文件中查找并输出6个特定的时间戳+; 本周末,我一直试图熟悉ReGEX,意图将其实现为C++程序,以提取并不仅将它们输出到控制台窗口,而且将它们输出到简单的输出文本文件。以下是我到目前为止收集到的信息。但是,我下面的内容只将第一个时间戳打印到控制台窗口,并且也只将第一个时间戳打印到输出文件,而忽略其他5个时间戳。有人能帮我找到哪里出了问题吗?在上进行测试后,正则表达式可以工作,c++,regex,xml,C++,Regex,Xml,XML文件: 当前状态下控制台窗口的屏幕截图: 我试图提取的6个时间戳的屏幕截图: #包括 #包括 #包括 #包括 使用名称空间std; int main() { 河流充填; 出流孔的直径; 字符串文件输入; int i=0; outFile.open(“Outputdata.txt”); infle.open(“Groupproject.xml”);//打开包含要读取的信息的xml文件 正则表达式时间\u正则表达式(\\d\\d\\d\\d-\\d\\d-\\d\\d\\w\\d\\d:\\d

XML文件:

当前状态下控制台窗口的屏幕截图:

我试图提取的6个时间戳的屏幕截图:

#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
河流充填;
出流孔的直径;
字符串文件输入;
int i=0;
outFile.open(“Outputdata.txt”);
infle.open(“Groupproject.xml”);//打开包含要读取的信息的xml文件
正则表达式时间\u正则表达式(\\d\\d\\d\\d-\\d\\d-\\d\\d\\w\\d\\d:\\d\\d:\\d\\d\\d\\.716Z);
smatch time_比赛;
if(infle.fail())
{

cout我猜你的问题在这里:


coutRegex对于这项工作来说是错误的工具,因为XML不是一种常规语言(从技术计算机科学的意义上讲)。使用XML解析器。如果您使用正则表达式,您的程序将不正确。它可能可以处理10000个输入文档中的9999个,但迟早会失败。如果有人恶意想发现您系统中的弱点,那么它当然会很快失败。

我使用正则表达式,因为作为CS专业的新生,我的能力非常有限但是,我认为正则表达式在这种特殊情况下可以工作,因为解决方案不需要是可移植的,它只需要在这个用例中工作,使用这个特定的XML文件。因此,显然
time\u匹配[0]
是与我的正则表达式匹配的所有内容的副本,是否有方法输出复制到
时间匹配[0]
中的6个不同时间戳?提前感谢!我是否尝试扩展代码以提取1行特定的功耗数据(屏幕截图:)从同一个XML文件中,目标是最终找到该特定行中所有数字的平均值。然而,当我试图推断时间戳在这个特定实例中起作用的解决方案时,我无法让我的代码生成我想要的结果。此外,是否有办法以某种方式找到t的平均值软管号码容易吗?我的代码现在:你不要说你得到的结果考虑改变你的正则表达式从<代码> 3 [8-9] d d+s+<代码>到<代码> 3 [8-9] \d*s*<代码>,以避免在行的末尾需要一个空格。对不起,我应该指定。我得到的结果是:现在,在改变正则表达式从<代码> 3 [8-9]之后。\d\d\s+
3[8-9]\d\d\s*
“我得到:。哪一个更好,但仍然不是25个数字的完整行谢谢您的输入!然而,我是CS的一名新生,不幸的是,我认为我不能用我所掌握的有限知识轻松实现XML解析器。这只是用于一个组项目,其中它只需要使用s单XML文件,所以我认为正则表达式可以在这个特定的用例中工作。
#include <fstream>
#include <string>
#include <iostream>
#include <regex>

using namespace std;

int main()

{
ifstream infile;
ofstream outFile;
string fileinput;
int i = 0;
outFile.open("Outputdata.txt");
infile.open("Groupproject.xml"); // Opens the XML file containing the information that is to be read

regex time_regex("\\d\\d\\d\\d-\\d\\d-\\d\\d\\w\\d\\d:\\d\\d:\\d\\d\\.716Z");

smatch time_matches;




if (infile.fail())
{
    cout << "The file is not able to be located" << endl;
    system("Pause");
    exit(1);
}


while (!infile.eof()) {  //Until the end of the file is reached, obtain each line
    getline(infile, fileinput);

    if (regex_search(fileinput, time_matches, time_regex)) { // if regex_search is able to locate a line which has elements matching the regex expression "time_regex" output the located element

    cout << "Timestamp: " << time_matches[i] << endl;
    outFile << time_matches[i];
    i++;
}

}
infile.close();
outFile.close();

system("pause");
return 0;
 }