匹配什么样的括号包含一个字符串并删除它

时间:2011-01-12 12:52:30

标签: c

我试图摆脱字符串周围的括号。例如:我可以拥有(此字符串)或{This String}或[This String]或+ This String +。我想只返回 This String (没有任何类型的括号或+ s)。

我花了很多时间在正则表达式上并放弃了。如果你能提供帮助,那就太棒了。

5 个答案:

答案 0 :(得分:1)

这是一种可行的方法。不一定是效率最高且没有完整的错误检查。

编辑根据对其他帖子的评论进行更新,使其听起来好像括号可以在字符串中的任何位置。只要所有匹配的括号括号都匹配,就会删除匹配的所有匹配括号。如果找不到右括号,它会全部删除它们。 OP需要做一些功课。它也没有检查支架的正确平衡,如果这是一个要求我不清楚。

// return 1 if a bracket is found
int RemoveBracket( char *str )
{
    char openbracket[] = {'[', '(', '{', '+', '\0' };
    char closebracket[] = {']', ')', '}', '+', '\0' };
    int start, end, j;
    char match = 0;

    // find open bracket
    start = 0;
    for ( ; str[start] && !match; start++ ) {
        for ( j = 0; openbracket[j] && !match; j++ ) {
            if ( str[start] == openbracket[j] ) 
                match = closebracket[j];
            }
        if ( match ) 
            break;
        }

    if ( match == 0 )
        // no open bracket found
        return 0;

    // find closing bracket 
    end = start + 1;
    for ( ; str[end]; end++ ) {
        if ( str[end] == match )
            break;
        }

    if ( !str[end] )
        // no closing bracket found
        return 0;

    // remove them
    memmove( str + start, str + start + 1, end - start - 1 );
    memmove( str + end - 1, str + end + 1, strlen( str + end ) );
    return 1;  // since we found one
}

void RemoveBrackets( char *str )
{
    // remove matching brackets.  
    while ( RemoveBracket(str ))
        ;
}

int main( int argc, char* argv[] )
{
    char str[50];
    strcpy( str, "a[b(c)de]" );
    RemoveBrackets( str );
    printf( "%s\n", str );
    strcpy( str, "{not bracketed" );
    RemoveBrackets( str );
    printf( "%s\n", str );
    strcpy( str, "(paren)s" );
    RemoveBrackets( str );
    printf( "%s\n", str );
    strcpy( str, "abc+def+{gh}i" );
    RemoveBrackets( str );
    printf( "%s\n", str );
}

答案 1 :(得分:1)

我找到了一种更简单的方法来解决这个问题:

转到字符串中的每个字符(如果它与{[(<+_->)]}匹配),然后用空格替换该字符,然后稍后修剪该空格。

非常感谢你的帮助。

答案 2 :(得分:0)

这是我的解决方案:

int main(int argc, char *argv)
{
    char *string = "abc [def] ghi";
    char *final = (char *) malloc(strlen(string) + 1);
    int length = 0;
    int count = 0;

    // process every single character of string
    for(count; count <= strlen(string); count++) {
        // check if it has to be copied or not
        if(string[count] != '[' && string[count] != ']') {
            // if it has, copy it and increase length of final
            final[length] = string[count];
            length += 1;
        }
    }

    // then 'throw away' unused memory
    final = (char *) realloc((void *) final, length);

    printf("%s\n", final);
}

这是输出:

blackbear@blackbear-laptop:~$ ./prova.out 
abc def ghi

然后通过if..else if..else if..switch(string[count])或再次使用数组添加您的I / O代码及其括号类型,并将我的if替换为每个检查的循环支架类型。

答案 3 :(得分:0)

使用c字符串非常简单。

char s[] = "{test}";

size_t t = strlen(s) - 2;
memmove(s, s + 1, t);
s[t] = '\0';

答案 4 :(得分:-1)

char currentChar,initChar;
initChar=myString[0];

//You should check if exits
currentChar=myString[1];

string noBracketString;
int cont=0;

while(currentChar!=initChar){
   noBracketString+=currentChar;
   cont++;
   currentChar=myString[cont];
}
//String without brackets
return noBracketString;

希望帮助!