.net 在C+中捕获组+/CLI
您好,我正在尝试使用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_
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对象的第一个元素