3

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);

しかし、私が得たのは最後の一致 (BLANC0008) だけです。

明確にできることを願っています。手伝ってくれてありがとう

4

3 に答える 3

3

式を次のように置き換えるだけです

'(?<property>[\d\w]+)'

それらすべてを取得します。

于 2013-11-12T21:45:34.607 に答える
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;
    }
}

このコードは文字ごとに実行され、一重引用符に到達すると、別の一重引用符に到達するまで文字列の「保存」が開始されます。他のすべての文字を無視し、一重引用符内の文字のみに焦点を当てます。何よりも、ネストされた引用符を簡単に使用できるようにこれを適応させることができます。

于 2013-11-12T19:35:00.113 に答える