c - 正则表达式:匹配c中的 float

标签 c regex

我使用以下两个正则表达式来匹配数字(例如,1.2、1 ...)

regex_text0 = "[0-9]+|\.[0-9]+|[0-9]+\.[0-9]";

regex_text = "[0-9]+|[.][0-9]+|[0-9]+[.][0-9]+";

以及执行它的以下函数。

static int match_regex (regex_t * r, const char * to_match)
{
const char * p = to_match;
const int n_matches = 10;
regmatch_t m[n_matches];

while (1) {
    int i = 0;
    int nomatch = regexec (r, p, n_matches, m, 0);
    if (nomatch) {
        printf ("No more matches.\n");
        return nomatch;
    }

    for (i = 0; i < n_matches; i++) {
        int start;
        int finish;
        if (m[i].rm_so == -1) {
            printf("break ");
            break;
        }
        start = m[i].rm_so + (p - to_match);
        finish = m[i].rm_eo + (p - to_match);
        if (i == 0) {
            printf ("$& is ");
        }
        else {
            printf ("$%d is ", i);
        }
        printf ("'%.*s' (bytes %d:%d)\n", (finish - start),
            to_match + start, start, finish);
    }
    p += m[0].rm_eo;
}
return 0;
}

但是两个正则表达式的结果是不同的。

Trying to find '[0-9]+|[.][0-9]+|[0-9]+[.][0-9]+' in '1.0 + 2.3'                                                                                
$& is '1.0' (bytes 0:3)                                                                                                                         
break                                                                                                                                           
$& is '2.3' (bytes 6:9)                                                                                                                         
break                                                                                                                                           
No more matches.                                                                                                                                
Trying to find '[0-9]+|.[0-9]+|[0-9]+.[0-9]' in '1.0 + 2.3'                                                                                     
$& is '1.0' (bytes 0:3)                                                                                                                         
break                                                                                                                                           
$& is ' 2' (bytes 5:7)                                                                                                                          
break                                                                                                                                           
$& is '.3' (bytes 7:9)                                                                                                                          
break                                                                                                                                           
No more matches.  

问题:

  • 这两个正则表达式有什么区别?
  • 为什么regexec()每次只匹配一个数字,但regexec()的原型(prototype)却想要一个regmatch_t数组?<

最佳答案

您的第二个正则表达式 [0-9]+|[.][0-9]+|[0-9]+[.][0-9]+ 允许像 这样的数字>12.2113.131,其中第一个仅接受 13.11.1,即 之后的一位数字。如果 . 之前存在数字。这是因为第二个正则表达式末尾有 + 符号。这是两个正则表达式之间的唯一区别。

关于c - 正则表达式:匹配c中的 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26843988/

相关文章:

mysql - 如何知道 float 中小数点右边的位数?

c - OS X 链接器中 GNU 的 --wrap 链接器标志的等价物是什么?

c - 段错误(核心转储)错误 (C)

java - 如何使这个正则表达式成为有效的 Java 正则表达式?

regex - 在 SED 命令中传递多个文件 : Log Extract

javascript - jQuery 使用 RegEx 验证电话号码

c - 如何提高以下循环的性能

c - C 新手,在多个函数中使用用户输入

c - 取消引用大小为 Legal 的未初始化指针吗?

ruby - 如何编写正则表达式从字符串中提取数值?