正则表达式 - 匹配相同模式的组

时间:2013-11-12 18:48:51

标签: c# regex regex-group

我正在尝试使用C#匹配相同模式的正则表达式组。 这是一个我无法开展工作的小例子。

我需要所有单引号之间的字符串(例如CodigoEmpresa)

uses MainRecord, objErrorList, SysUtils, XMLMXMWebServiceReturn, objMainProcesso,
 objProcessoWS, objProcessaRelatorioQuickReport, QuickRpt, Forms,
 RBalanc, RBalancete, RBaCCMens, RBalaMensal, RBalaMensalCons,
 objcadcontabilidade, objContabilidadeValidacoes;

const
CODIGO_EMPRESA             = 'CodigoEmpresa';
ANO_MES                    = 'AnoMes';
RELATORIO_POR              = 'RelatorioPOR';
CONTA_INI                  = 'ContaIni';
CONTA_FIM                  = 'ContaFim';
GRAU_CONTA                 = 'GrauConta';
CCUSTOS_INI                = 'CCustosIni';
CCUSTOS_FIM                = 'CCustosFim';
GRAU_CCUSTOS               = 'GrauCCustos';
DETALHAR_CONSOLIDADO       = 'DetalharConsolidado';
DESCONSIDERAR_ENCERRAMENTO = 'DesconsiderarEncerramento';
QUEBRA_CCUSTO              = 'QuebraCCusto';
CONTAS_SEM_MOVIMENTO       = 'ContasSemMovimento';
CODIGO_ALTERNATIVO         = 'CodigoAlternativo';

const

ERROR_BALANCETE_MENSAL_0001 = 'BALANC0001';
ERROR_BALANCETE_MENSAL_0002 = 'BALANC0002'; //Empresa Inexistente
ERROR_BALANCETE_MENSAL_0003 = 'BALANC0003';
ERROR_BALANCETE_MENSAL_0004 = 'BALANC0004';
ERROR_BALANCETE_MENSAL_0005 = 'BALANC0005';
ERROR_BALANCETE_MENSAL_0006 = 'BALANC0006';
ERROR_BALANCETE_MENSAL_0007 = 'BALANC0007';
ERROR_BALANCETE_MENSAL_0008 = 'BALANC0008';

到目前为止我已经尝试过了:

Match match = Regex.Match(delphiFileInText, @"const.+=\s*'(?<property>[\d\w]+)'", RegexOptions.IgnoreCase | RegexOptions.Singleline);

但我得到的只是最后一场比赛(BALANC0008);

我希望我能说清楚。谢谢你的帮助

3 个答案:

答案 0 :(得分:3)

只需用

替换表达式
'(?<property>[\d\w]+)'

将获得所有这些。

答案 1 :(得分:1)

我建议使用以下正则表达式:

'(?<property>(?:\\'|[^'])*)'

将捕获输入中的所有单引号分隔字符串。如果你想捕获常量,我建议使用以下正则表达式:

(?<const>\w+)\s*=\s*'(?<property>(?:\\'|[^'])*)'

答案 2 :(得分:0)

看起来为了做你想做的事情,你真的不需要正则表达式但是可以逐字逐句地翻阅文件并以这种方式解析它。它比试图找出正则表达式要简单得多,它不会是“只读”(意味着当你回到代码后,你会知道该做什么。这是一个我烘焙的课程对于这个(我没有完全测试它,但确实对一个示例字符串进行了快速测试,它的工作原理就像那里宣传的那样):

public class Parser
{
    bool inQuotes;
    public Parser()
    {
        inQuotes = false;
    }

    public List<string> Parse(string input)
    {
        List<string> output = new List<string>();
        StringBuilder temporaryString = new StringBuilder();
        for (int i = 0; i < input.Length; i++)
        {
            if (input[i] == '\'' && !inQuotes)
            {
                inQuotes = true;
                continue;
            }
            else if (input[i] == '\'' && inQuotes)
            {
                output.Add(temporaryString.ToString());
                inQuotes = false;
                temporaryString = new StringBuilder();
            }
            else if (inQuotes)
            {
                temporaryString.Append(input[i]);
            }
        }
        return output;
    }
}

此代码将逐个字符地进行处理,当它触及单个引号时,它将开始“保存”字符串,直到它达到另一个单引号。它会忽略所有其他字符,只关注单引号内的字符。最重要的是,你是否可以调整它以容易地使用嵌套引号。