簡體   English   中英

C語言正則表達式匹配字符串的多個部分

[英]c language regex matching mutiple parts of a string

我有一個c程序,在其中我無法使正則表達式匹配按我想要的方式工作。 基本上,我想將testStr中的第一個字符(W或M)與第二個匹配項(TESTY.LOG)的日志文件名進行匹配。 這是我到目前為止的內容:

#include    <stdio.h>
#include    <stdlib.h>
#include    <regex.h>
#define     MAX_MATCHES 2
.....
char testStr[20]="W TESTY.LOG ";
char temp[100];
int reti;
regex_t regex;
regmatch_t matches[MAX_MATCHES];
int i;
int numchars;

/* Compile regular expression */
reti = regcomp(&regex, "^([W|M])[[:space:]]([A-Z|0-9|\.]{1,})[[:space:]]*$", REG_EXTENDED);
/* Execute regular expression */
reti = regexec(&regex, testStr, MAX_MATCHES, matches, 0);
if (!reti) {
  for (i=0; i < MAX_MATCHES; i++) {
    numchars = (int)matches[i].rm_eo - (int)matches[i].rm_so;
    strncpy(temp,testStr+matches[i].rm_so,numchars);
    temp[numchars] = '\0';
  }
}

當我在gdb中運行它時,我看到以下匹配項:

(gdb) display matches 1: matches = {{rm_so = 0, rm_eo = 15}, {rm_so = 0, rm_eo = 1}}

2: temp = "W TESTY.LOG"

2: temp = "W"

因此,我得到了第一個字符,但是我得到的不僅僅是第二個匹配項的日志文件名。 我在perl中使用了regex,但是在ANSI C中是regex的新手。 我覺得這里缺少基本的東西。

匹配0是整個正則表達式(Perl的$& )匹配的字符串的一部分。 i > 0的匹配i是匹配捕獲部分i的匹配部分,與Perl的$1, $2, … 您有兩次捕獲,因此您應該期待三場比賽。 但是您將MAX_MATCH指定為2,因此最后一個匹配項被丟棄。


另外,正則表達式

^([W|M])[[:space:]]([A-Z|0-9|\.]{1,})[[:space:]]*$

有點奇怪。 我認為您應該重新閱讀有關正則表達式中字符類的文檔-在這種情況下,Perl中的內容與Posix擴展RE中的相同。 [W|M]匹配三個字符W|中的任何一個 M。 同樣, [AZ|0-9|\\.]{1,}匹配字母,數字,字符|中的一個或多個。 或角色

反斜杠是無關緊要的,因為它只逃脫了 在字符串文字中,不需要轉義。 如果您在啟用警告的情況下-Wall進行了編譯,則您的C編譯器可能會警告您轉義序列不合法。 如果您實際上已經將反斜杠傳遞給了regex庫,則它將把它解釋為字符類的另一個可能的匹配項。

同樣,在Perl和Posix Extended RE中, {1,}都可以方便地寫為+

簡而言之,您可能想要的是:

reti = regcomp(&regex, "^([WM])[[:space:]]([A-Z0-9.]+)[[:space:]]*$", REG_EXTENDED)

您也可以使用

reti = regcomp(&regex, "^([WM])[[:space:]]([[:alnum:].]+)[[:space:]]*$", REG_EXTENDED)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM