Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在C+中捕获组+/CLI_.net_Regex_C++ Cli - Fatal编程技术网

.net 在C+中捕获组+/CLI

.net 在C+中捕获组+/CLI,.net,regex,c++-cli,.net,Regex,C++ Cli,您好,我正在尝试使用C++/CLI中的正则表达式从更大的字符串中捕获子字符串 代码如下: System::String^ str_path = "C:\\users\\Downloads\\myfile.pl"; Regex^ pat_scriptname = gcnew Regex("(.[^\.]*)\.pl"); Match^ scrpt_name = pat_scriptname->Match(str_path); System::String^ filename = scrpt_

您好,我正在尝试使用C++/CLI中的正则表达式从更大的字符串中捕获子字符串 代码如下:

System::String^ str_path = "C:\\users\\Downloads\\myfile.pl";
Regex^ pat_scriptname = gcnew Regex("(.[^\.]*)\.pl");
Match^ scrpt_name = pat_scriptname->Match(str_path);
System::String^ filename = scrpt_name->Value;
这里我只想捕获子字符串“myfile”…但它不起作用,
保存在
文件名中的输出总是“myfile.pl”

有几点:

首先,你需要更多的反斜杠<代码>\。
在C++/CLI中是转义句点,而不是在字符串中插入反斜杠。(您在路径中做得很好,别忘了在正则表达式中做。)注意,编译器在这里给您一个警告:
警告C4129:'。:无法识别的字符转义序列

gcnew Regex("(.[^\\.]*)\\.pl");
                 ^^    ^^
其次,在
[]
中,我假设您希望匹配除句号和反斜杠之外的所有字符。当它的读数为“[^\\.]”时,它将匹配除句点以外的所有字符。(反斜杠转义正则表达式中的句点,使其成为显式句点而不是任何字符。)因此,我们需要同时转义反斜杠和句点

gcnew Regex("(.[^\\\\\\.]*)\\.pl");
                 ^^  ^^ escape the period
                 ^^ escape the backslash
您说过希望输出为
myfile
。前面的
,正好与
myfile
前面的反斜杠匹配,所以让我们去掉它

gcnew Regex("([^\\\\\\.]*)\\.pl");
现在,调用
->Value
。最后我们得到了
Group[0]->Value
,这是匹配的完整正则表达式。引述:

如果正则表达式引擎可以找到匹配项,则Groups属性返回的GroupCollection对象的第一个元素包含与整个正则表达式模式匹配的字符串。如果正则表达式包含捕获组,则每个后续元素表示一个捕获组

因为我们想要第一个捕获的组:

String^ filename = scrpt_name->Groups[1]->Value;
最终代码:

String^ str_path = "C:\\users\\Downloads\\myfile.pl";
Regex^ pat_scriptname = gcnew Regex("([^\\\\\\.]*)\\.pl");
Match^ scrpt_name = pat_scriptname->Match(str_path);
String^ filename = scrpt_name->Groups[1]->Value;

Debug::WriteLine(filename);
输出:

myfile
myfile有几件事:

首先,你需要更多的反斜杠<代码>\。在C++/CLI中是转义句点,而不是在字符串中插入反斜杠。(您在路径中做得很好,别忘了在正则表达式中做。)注意,编译器在这里给您一个警告:
警告C4129:'。:无法识别的字符转义序列

gcnew Regex("(.[^\\.]*)\\.pl");
                 ^^    ^^
其次,在
[]
中,我假设您希望匹配除句号和反斜杠之外的所有字符。当它的读数为“[^\\.]”时,它将匹配除句点以外的所有字符。(反斜杠转义正则表达式中的句点,使其成为显式句点而不是任何字符。)因此,我们需要同时转义反斜杠和句点

gcnew Regex("(.[^\\\\\\.]*)\\.pl");
                 ^^  ^^ escape the period
                 ^^ escape the backslash
您说过希望输出为
myfile
。前面的
,正好与
myfile
前面的反斜杠匹配,所以让我们去掉它

gcnew Regex("([^\\\\\\.]*)\\.pl");
现在,调用
->Value
。最后我们得到了
Group[0]->Value
,这是匹配的完整正则表达式。引述:

如果正则表达式引擎可以找到匹配项,则Groups属性返回的GroupCollection对象的第一个元素包含与整个正则表达式模式匹配的字符串。如果正则表达式包含捕获组,则每个后续元素表示一个捕获组

因为我们想要第一个捕获的组:

String^ filename = scrpt_name->Groups[1]->Value;
最终代码:

String^ str_path = "C:\\users\\Downloads\\myfile.pl";
Regex^ pat_scriptname = gcnew Regex("([^\\\\\\.]*)\\.pl");
Match^ scrpt_name = pat_scriptname->Match(str_path);
String^ filename = scrpt_name->Groups[1]->Value;

Debug::WriteLine(filename);
输出:

myfile
myfile有几件事:

首先,你需要更多的反斜杠<代码>\。在C++/CLI中是转义句点,而不是在字符串中插入反斜杠。(您在路径中做得很好,别忘了在正则表达式中做。)注意,编译器在这里给您一个警告:
警告C4129:'。:无法识别的字符转义序列

gcnew Regex("(.[^\\.]*)\\.pl");
                 ^^    ^^
其次,在
[]
中,我假设您希望匹配除句号和反斜杠之外的所有字符。当它的读数为“[^\\.]”时,它将匹配除句点以外的所有字符。(反斜杠转义正则表达式中的句点,使其成为显式句点而不是任何字符。)因此,我们需要同时转义反斜杠和句点

gcnew Regex("(.[^\\\\\\.]*)\\.pl");
                 ^^  ^^ escape the period
                 ^^ escape the backslash
您说过希望输出为
myfile
。前面的
,正好与
myfile
前面的反斜杠匹配,所以让我们去掉它

gcnew Regex("([^\\\\\\.]*)\\.pl");
现在,调用
->Value
。最后我们得到了
Group[0]->Value
,这是匹配的完整正则表达式。引述:

如果正则表达式引擎可以找到匹配项,则Groups属性返回的GroupCollection对象的第一个元素包含与整个正则表达式模式匹配的字符串。如果正则表达式包含捕获组,则每个后续元素表示一个捕获组

因为我们想要第一个捕获的组:

String^ filename = scrpt_name->Groups[1]->Value;
最终代码:

String^ str_path = "C:\\users\\Downloads\\myfile.pl";
Regex^ pat_scriptname = gcnew Regex("([^\\\\\\.]*)\\.pl");
Match^ scrpt_name = pat_scriptname->Match(str_path);
String^ filename = scrpt_name->Groups[1]->Value;

Debug::WriteLine(filename);
输出:

myfile
myfile有几件事:

首先,你需要更多的反斜杠<代码>\。在C++/CLI中是转义句点,而不是在字符串中插入反斜杠。(您在路径中做得很好,别忘了在正则表达式中做。)注意,编译器在这里给您一个警告:
警告C4129:'。:无法识别的字符转义序列

gcnew Regex("(.[^\\.]*)\\.pl");
                 ^^    ^^
其次,在
[]
中,我假设您希望匹配除句号和反斜杠之外的所有字符。当它的读数为“[^\\.]”时,它将匹配除句点以外的所有字符。(反斜杠转义正则表达式中的句点,使其成为显式句点而不是任何字符。)因此,我们需要同时转义反斜杠和句点

gcnew Regex("(.[^\\\\\\.]*)\\.pl");
                 ^^  ^^ escape the period
                 ^^ escape the backslash
您说过希望输出为
myfile
。前面的
,正好与
myfile
前面的反斜杠匹配,所以让我们去掉它

gcnew Regex("([^\\\\\\.]*)\\.pl");
现在,调用
->Value
。最后我们得到了
Group[0]->Value
,这是匹配的完整正则表达式。引述:

如果正则表达式引擎可以找到匹配项,则组返回的GroupCollection对象的第一个元素