簡體   English   中英

我正在嘗試從 xml 文件中讀取正則表達式,但是當我將正則表達式傳遞給 C# 代碼時,卻得到了錯誤匹配

[英]I'm trying to read a Regex from an xml file but when i pass on the Regex to the C# code but I'm getting false matches

當我通過 Xml 提供我的 Regex 時,我得到了 False 匹配,但是當我在 C# 代碼中對 Regex 進行硬編碼時,我得到了正確的 Matches ,請幫助我。

當我直接將 Regex 放入代碼時,代碼運行良好。 當我開始使用 XML 文件時,問題就開始了

public static List<string> RegxFind(string path, string XmlPath)
{
    string Patterns = "";
    XmlReader reader = XmlReader.Create(XmlPath);
    while (reader.Read())
    {
        if (reader.IsStartElement())
        {
            switch (reader.Name.ToString())
            {
                case "reg1":
                    Console.WriteLine(reader.Value);
                    Console.ReadKey();
                    Patterns = reader.Value;
                    break;
            }
        }
    }

    List<string> Results = new List<string>();

    Excel.Application xlapp = new Excel.Application();
    Excel.Workbooks xlworkbooks = xlapp.Workbooks;
    //string Pattern = @"\b[0-9DEF]{2}[A-z]{ 2}[0-9]{6}[0-9]{3}|[0-9DEF]{2}[A-z]{2}[0-9]{6}[\S\s][0-9]{3}|[0-9DEF]{2}[A-z]{2}[0-9]{6}[\S\s][\s][0-9]{3}|[0-9DEF]{2}[A-z]{2}[\s\W\d]{8,12}\b";

    try
    {
        xlapp = new Excel.Application();
        xlapp.Visible = true;
        xlworkbooks = xlapp.Workbooks;
        Excel.Workbook xlworkbook = xlworkbooks.Open(path);
        Excel.Sheets xlsheets = xlworkbook.Worksheets;
        Excel._Worksheet xlsheet = xlworkbook.Sheets[1];
        Excel.Range xlRange = xlsheet.UsedRange;

        int rowCount = xlRange.Rows.Count;
        int colCount = xlRange.Columns.Count;

        for (int i = 1; i <= rowCount; i++)
        {
            for (int j = 1; j <= colCount; j++)
            {
                if (xlRange.Cells[i, j].value != null)
                {
                    //Console.WriteLine("vlues" + xlRange.Cells[i, j].Value);
                    //Console.ReadKey();
                    string tempstr = Convert.ToString((xlRange.Cells[i, j].Value));
                    Match m = Regex.Match(tempstr, Patterns);
                    if (m.Success)
                    {
                        Results.Add((xlRange.Cells[i, j].Value) + "<>");
                        tempstr = "";
                    }
                    else
                    {
                        tempstr = "";
                        m.NextMatch();
                    }
                }
                else
                {
                    continue;
                }
            }
        }

        xlworkbook.Close();
        xlapp.Quit();
        return Results;
    }
    catch (Exception es)
    {
        Console.WriteLine("error:" + es);
        Console.ReadKey();
        return Results;
    }
}

問題是,當我從 xml 文件中讀取時,我無法獲得正確的匹配,因為 Pattern 變量在 Regx.match(tempstr,patterns) 行沒有收到任何值我想要代碼給我正確的模式匹配這里的 xml 供參考:

<?xml version="1.0" encoding="UTF-8"?>
<pattern>
<reg1>@"\b[0-9DEF]{2}[A-z]{ 2}[0-9]{6}[0-9]{3}|[0-9DEF]{2}[A-z]{2}[0-9]{6}[\S\s][0-9]{3}|[0-9DEF]{2}[A-z]{2}[0-9]{6}[\S\s][\s][0-9]{3}|[0-9DEF]{2}[A-z]{2}[\s\W\d]{8,12}\b"</reg1>
</pattern>

首先,稍微修正一下您的模式:1) 將備選方案分組,以便單詞邊界可以應用於所有備選方案,2) 將[Az]替換為[A-Za-z]以僅匹配 ASCII 字母和 3) 刪除內部的空格限制量詞。

所以,它至少應該看起來像

\b(?:[0-9DEF]{2}[A-Za-z]{2}[0-9]{6}[0-9]{3}|[0-9DEF]{2}[A-Za-z]{2}[0-9]{6}[\S\s][0-9]{3}|[0-9DEF]{2}[A-Za-z]{2}[0-9]{6}[\S\s][\s][0-9]{3}|[0-9DEF]{2}[A-Za-z]{2}[\s\W\d]{8,12})\b

[0-9DEF]{2}[A-Za-z]{2}啟動所有備選方案時,您可以通過將其進一步分組來進一步收縮它:

\b[0-9DEF]{2}[A-Za-z]{2}(?:[0-9]{6}(?:[0-9]{3}|[\S\s]\s?[0-9]{3})|[\s\W\d]{8,12})\b

請參閱正則表達式演示

將其作為CDATA塊內的字符串放入Patterns.xml文件中,以避免轉義字符:

<?xml version="1.0" encoding="UTF-8"?>
<pattern>
  <reg1><![CDATA[\b[0-9DEF]{2}[A-Za-z]{2}(?:[0-9]{6}(?:[0-9]{3}|[\S\s]\s?[0-9]{3})|[\s\W\d]{8,12})\b]]></reg1>
</pattern>

閱讀:

public static string RegxFind(string XmlPath)
{
    var xml = XDocument.Load(XmlPath);
    return xml.Root.Descendants("reg1").FirstOrDefault()?.Value;
}

然后,將其讀入任何變量,無論是否為靜態:

var pattern = RegxFind(path_to_xml);

並使用該模式。

暫無
暫無

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

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