C++ boost正则表达式中的命名捕获/组列表

C++ boost正则表达式中的命名捕获/组列表,c++,regex,boost,named,capture-group,C++,Regex,Boost,Named,Capture Group,我想知道如何在boost的正则表达式中获取捕获组的名称 例如,如果用户输入一个字符串,该字符串应该是具有命名捕获组的有效正则表达式,那么如何遍历正则表达式中已定义组的列表并获取这些组的名称。boost是否提供了这样做的工具,或者我需要编写自己的解析器来提取这些名称 例如,如果输入字符串为: (?<year>[0-9]{4}).*(?<month>[0-9]{2}).*(?<day>[0-9]{2}) (?[0-9]{4})。*(?[0-9]{2})。*(?[

我想知道如何在boost的正则表达式中获取捕获组的名称

例如,如果用户输入一个字符串,该字符串应该是具有命名捕获组的有效正则表达式,那么如何遍历正则表达式中已定义组的列表并获取这些组的名称。boost是否提供了这样做的工具,或者我需要编写自己的解析器来提取这些名称

例如,如果输入字符串为:

(?<year>[0-9]{4}).*(?<month>[0-9]{2}).*(?<day>[0-9]{2})
(?[0-9]{4})。*(?[0-9]{2})。*(?[0-9]{2})

我希望能够从正则表达式中提取“年”、“月”和“日”。

您可以使用以下正则表达式:

"\?<([^<>]+)>"

对于其他情况,您必须编写另一个。您可以使用以下正则表达式:

"\?<([^<>]+)>"

对于其他案例,您必须再写一个。

谢谢您的回答。我更想知道这是否是由regex引擎提供的。我试图找到这样的设施,但徒劳无功。您知道如何找到提取的名称所属的捕获组吗?假设第二个捕获组未在输入正则表达式中命名
(?[0-9]{4})。*([0-9]{2})。*(?[0-9]{2})
我们能发现那天是指第三个捕获组吗?谢谢你的回答。我更想知道这是否是由regex引擎提供的。我试图找到这样的设施,但徒劳无功。您知道如何找到提取的名称所属的捕获组吗?假设第二个捕获组未在输入正则表达式中命名
(?[0-9]{4})。*([0-9]{2})。*(?[0-9]{2})
我们能发现那天实际上是指第三个捕获组吗?也许你可以将正则表达式编译成boost正则表达式,然后从中获取捕获名称。可以这样做,但命名子表达式存在问题。从技术上讲,当解析正则表达式时,每个名称都会变成一个散列并放入一个向量,其中进一步的引用是通过一个id进行的。请查看boost_regex.hpp中名为_subexpressions的类。可以修改它以创建实际字符串名称的映射。在这里,您可以添加一个调用来获取组索引名称。(对不起,源代码应该是basic_regex.hpp)我可以发布几行代码来实现这一点,但您必须重新编译引擎。我不确定这是否合法。它应该是这样的:
classnamed_subexpressions{public:…voidset_name(constcharT*I,constcharT*j,intindex){…std::stringstmp(I,j);intalen=(int)stmp.length();if(alen>0){longest_name=alen>longest_name?alen:longest_name;m_sub_sNames[index]=stmp;}std::stringget_name(intndx)const{if(longest_name>0){autogroupName=m_sub_sNames.find(ndx);if(groupName!=m_sub_sNames.end())returngroupName->second;}return“”;}intget_longest_namelen(){returnlongest_name;}private:intlongest_name;std::mapm sub sNames
您将迭代这些组。从regex对象获取捕获组的数量。grpnum=0-num\grps
std::string grpname=rxobj.Get_named_subs()->Get_name(grpnum);if(grpname.length()>0){…}
@sln谢谢!很好的解决方案,但我怀疑我是否获得在存储库中更改boost代码的权限…至少我知道为什么一开始我找不到该工具!它根本不在那里!:-)也许你可以将正则表达式编译成boost正则表达式,然后从中获取捕获名称。可以这样做,但命名子表达式存在问题。从技术上讲,当解析正则表达式时,每个名称都会变成一个散列并放入一个向量,其中进一步的引用是通过一个id进行的。请查看boost_regex.hpp中名为_subexpressions的类。可以修改它以创建实际字符串名称的映射。在这里,您可以添加一个调用来获取组索引名称。(对不起,源代码应该是basic_regex.hpp)我可以发布几行代码来实现这一点,但您必须重新编译引擎。我不确定这是否合法。它应该是这样的:
classnamed_subexpressions{public:…voidset_name(constcharT*I,constcharT*j,intindex){…std::stringstmp(I,j);intalen=(int)stmp.length();if(alen>0){longest_name=alen>longest_name?alen:longest_name;m_sub_sNames[index]=stmp;}std::stringget_name(intndx)const{if(longest_name>0){autogroupName=m_sub_sNames.find(ndx);if(groupName!=m_sub_sNames.end())returngroupName->second;}return“”;}intget_longest_namelen(){returnlongest_name;}private:intlongest_name;std::mapm sub sNames
您将迭代这些组。从regex对象获取捕获组的数量。grpnum=0-num\grps
std::string grpname=rxobj.Get_named_subs()->Get_name(grpnum);if(grpname.length()>0){…}
@sln谢谢!很好的解决方案,但我怀疑我是否获得在存储库中更改boost代码的权限…至少我知道最初为什么找不到该工具!它根本不在那里!:-)