Advertisement

c语言正则表达式检索文件名,正则表达式查找所有的搜索关键词匹配

阅读量:

我会推荐一个工具,如gplex/gppg,GOLD,ANTLR来做这种工作,特别是因为你会评估解析结果。

如果你坚持使用.NET RegEx,我建议你看看使用Balancing Group Definitions。

如果你想要一些更容易处理的事情,那么我会考虑编写一个简单的Recursive Descent Parser将输入分解为语法树,然后对其进行评估。维基百科有一个用C语言编写的体面样本(没有指针,所以很容易转换为.net),我也在下面复制它。

均衡组样品

using System;

using System.Text.RegularExpressions;

class Example

{

public static void Main()

{

string pattern = "[<>]*" +

"(" +

"((?'Open']*)+" +

"((?'Close-Open'>)[^<>]*)+" +

")*" +

"(?(Open)(?!))$";

string input = ">";

Match m = Regex.Match(input, pattern);

if (m.Success == true)

{

Console.WriteLine("Input: "{0}" \nMatch: "{1}"", input, m);

int grpCtr = 0;

foreach (Group grp in m.Groups)

{

Console.WriteLine(" Group {0}: {1}", grpCtr, grp.Value);

grpCtr++;

int capCtr = 0;

foreach (Capture cap in grp.Captures)

{

Console.WriteLine(" Capture {0}: {1}", capCtr, cap.Value);

capCtr++;

}

}

}

else

{

Console.WriteLine("Match failed.");

}

}

}

// The example displays the following output:

// Input: ">"

// Match: ">"

// Group 0: >

// Capture 0: >

// Group 1: >

// Capture 0:

// Capture 1: >

// Group 2:

// Capture 0:

// Capture 1:

// Capture 2:

// Group 3: >

// Capture 0: >

// Capture 1: >

// Capture 2: >

// Group 4:

// Group 5: mno

// Capture 0: abc

// Capture 1: xyz

// Capture 2: mno

递归下降解析器样品(来自Wikipedia)

typedef enum {ident, number, lparen, rparen, times, slash, plus,

minus, eql, neq, lss, leq, gtr, geq, callsym, beginsym, semicolon,

endsym, ifsym, whilesym, becomes, thensym, dosym, constsym, comma,

varsym, procsym, period, oddsym} Symbol;

Symbol sym;

void getsym(void);

void error(const char msg[]);

void expression(void);

int accept(Symbol s) {

if (sym == s) {

getsym();

return 1;

}

return 0;

}

int expect(Symbol s) {

if (accept(s))

return 1;

error("expect: unexpected symbol");

return 0;

}

void factor(void) {

if (accept(ident)) {

;

} else if (accept(number)) {

;

} else if (accept(lparen)) {

expression();

expect(rparen);

} else {

error("factor: syntax error");

getsym();

}

}

void term(void) {

factor();

while (sym == times || sym == slash) {

getsym();

factor();

}

}

void expression(void) {

if (sym == plus || sym == minus)

getsym();

term();

while (sym == plus || sym == minus) {

getsym();

term();

}

}

void condition(void) {

if (accept(oddsym)) {

expression();

} else {

expression();

if (sym == eql || sym == neq || sym == lss || sym == leq || sym == gtr || sym == geq) {

getsym();

expression();

} else {

error("condition: invalid operator");

getsym();

}

}

}

void statement(void) {

if (accept(ident)) {

expect(becomes);

expression();

} else if (accept(callsym)) {

expect(ident);

} else if (accept(beginsym)) {

do {

statement();

} while (accept(semicolon));

expect(endsym);

} else if (accept(ifsym)) {

condition();

expect(thensym);

statement();

} else if (accept(whilesym)) {

condition();

expect(dosym);

statement();

} else {

error("statement: syntax error");

getsym();

}

}

void block(void) {

if (accept(constsym)) {

do {

expect(ident);

expect(eql);

expect(number);

} while (accept(comma));

expect(semicolon);

}

if (accept(varsym)) {

do {

expect(ident);

} while (accept(comma));

expect(semicolon);

}

while (accept(procsym)) {

expect(ident);

expect(semicolon);

block();

expect(semicolon);

}

statement();

}

void program(void) {

getsym();

block();

expect(period);

}

全部评论 (0)

还没有任何评论哟~