这是我的Python程序:
import re
print re.findall( "([se]{2,30})ting", "testingtested" )
它的输出是:
['es']
这是我的期望。我希望得到“es”,因为我搜索了“e”或“s”的2-30个字符,然后是“ting”。
这是我的C程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <regex.h>
int main(void) {
regex_t preg;
regmatch_t pmatch;
char string[] = "testingtested";
//Compile the regular expression
if ( regcomp( &preg, "([se]{2,30})ting", REG_EXTENDED ) ) {
printf( "ERROR!\n" );
return -1;
} else {
printf( "Compiled\n" );
}
//Do the search
if ( regexec( &preg, string, 1, &pmatch, REG_NOTEOL ) ) {
printf( "No Match\n" );
} else {
//Allocate memory on the stack for this
char substring[pmatch.rm_eo - pmatch.rm_so + 1];
//Copy the substring over
printf( "%d %d\n", pmatch.rm_so, pmatch.rm_eo );
strncpy( substring, &string[pmatch.rm_so], pmatch.rm_eo - pmatch.rm_so );
//Make sure there's a null byte
substring[pmatch.rm_eo - pmatch.rm_so] = 0;
//Print it out
printf( "Match\n" );
printf( "\"%s\"\n", substring );
}
//Release the regular expression
regfree( &preg );
return EXIT_SUCCESS;
}
它的输出是:
Compiled
1 7
Match
"esting"
为什么C程序在结果中包含“ting”?我有办法排除“ting”部分吗?
答案 0 :(得分:3)
pmatch
是整个匹配,而不是第一个带括号的子表达式。
尝试将pmatch
更改为包含2个元素的数组,然后将2代替1传递给regexec
,并使用[1]
元素获取子表达式匹配。
对于引用C和Python之间的差异以及不同类型的正则表达式的其他人来说,这些都是无关的。这个表达非常简单,并没有发挥作用。
答案 1 :(得分:2)
虽然正则表达式在所有地方或多或少都相同,但确实支持的功能因实现而异。
不幸的是,在设计正则表达式时,您需要分别查阅每个正则表达式库的文档。