簡體   English   中英

無法在字符串工作的中間制作8位和13位正則表達式模式

[英]Can't make regex pattern for 8 and 13 digits in middle of string work

編輯2:

是的,就像我想的那樣,我需要將模式更改為2個不同的模式,因為OR會將13位數字匹配為8位數字匹配

THE SOLUTION IS:
Regex EAN8 = new Regex(@"\b\d{8}\b");
Regex EAN13 = new Regex(@"\d{13}\b");

PS FOR EDIT2:正如某人所說,將來可能我最終會找到EAN1234567890123或EAN_1234567890123,這些模式將無法解決,而且我不知道從哪里開始搜索這樣的模式。

我正在做一個項目,需要從一個文本中提取多個EAN。 我已經有一個驗證類,以查看它們是否有效。 我可以使用13位數字(但是我認為我使用的模式不正確,遲早會給您帶來麻煩。

字符串的示例:“ OL-120 112 82 Estuchado,fácilapertura。8410032002279227 24”

如您所見,中間有一個有效的EAN13:“ 8410032002279”我正在使用以下模式:

Regex EAN13 = new Regex(@"\d{13}");

它在字符串中提供了EAN,但我認為正確的模式應如下所示:

Regex EAN13 = new Regex(@"\d{13}$");

但是,當我使用它時,它不起作用。 可能是因為字符串沒有到此為止。

如果使用此模式,我的8位EAN也有類似的問題:

Regex EAN8 = new Regex(@"\d{8}");

它給了我13位數字eans減少到8位...

無論EAN在字符串中的位置如何,我都應該怎么做才能使兩種模式都起作用,並且對於8位數字,僅返回一個包含8位數字的真實字符串,而不能將其減小為8。

提前致謝

編輯:進一步的代碼,以了解我在做什么

Regex EAN = new Regex(@"\b(?:\d{8}|\d{13})\b");
using (StreamReader sr = new StreamReader(@"....txt"))
        {
            string currentLine;
            while ((currentLine = sr.ReadLine()) != null)
            {
                Match m13 = EAN.Match(currentLine);
                Match m8 = EAN.Match(currentLine);

                if (m8.Success)
                {
                    lista_EAN8.Add(m8.Value);
                    //string valido8 = new Ean8Validate().ValidateEan8(m8.Value);
                    //if (valido8 == m8.Value)
                    //{
                    //    lista_EAN8.Add(m8.Value);
                    //} 
                }

                if (m13.Success)
                {
                    string valido13 = new Ean13Validate().ValidateEan13(m13.Value);
                    if (valido13 == m13.Value)
                    {
                        lista_EAN13.Add(m13.Value);
                    }
                }
            }
        }

這樣,它在13位eans列表和8位eans列表中返回相同的值

使用以下正則表達式匹配813位數字。 \\b是在單詞字符和非單詞字符之間匹配的單詞邊界。 因此,它避免了在13位數字中匹配8位數字。

\b(?:\d{8}|\d{13})\b

好的,看起來您想要2種不同的正則表達式,一種只針對8位數字的匹配,另一種只針對13位的數字匹配

用於匹配8位EAN的使用;

\b(?:\d{8})\b

用於匹配並供13位EAN使用;

\b(?:\d{13})\b

另外,您是否希望可以使用EAN(大寫或小寫)的選項前綴;

8位

\b(?:[Ee][Aa][Nn])?(?:\d{8})\b

13位

\b(?:[Ee][Aa][Nn])?(?:\d{8})\b

對於您的示例,您想要修改代碼,以便其讀取如下內容。

Regex EAN8 = new Regex(@"\b(?:\d{8})\b");
Regex EAN13 = new Regex(@"\b(?:\d{13})\b");
using (StreamReader sr = new StreamReader(@"....txt"))
    {
        string currentLine;
        while ((currentLine = sr.ReadLine()) != null)
        {
            Match m13 = EAN13.Match(currentLine);
            Match m8 = EAN8.Match(currentLine);

            if (m8.Success)
            {
                lista_EAN8.Add(m8.Value);
            }

            if (m13.Success)
            {
                lista_EAN13.Add(m13.Value);
            }
        }
    }

現在,如果我們將正則表達式再多一點一點,即使在前綴為EAN *或EAN_ *的情況下,我們也可以從EAN數字中僅提取數字部分

Regex EAN8 = new Regex(@"\b(?:[Ee][Aa][Nn]_?)?(\d{8})\b");
Regex EAN13 = new Regex(@"\b(?:[Ee][Aa][Nn]_?)?(\d{13})\b");
using (StreamReader sr = new StreamReader(@"....txt"))
    {
        string currentLine;
        while ((currentLine = sr.ReadLine()) != null)
        {
            Match m13 = EAN13.Match(currentLine);
            Match m8 = EAN8.Match(currentLine);

            if (m8.Success)
            {
                lista_EAN8.Add(m8.Groups[1].Value);
            }

            if (m13.Success)
            {
                lista_EAN13.Add(m13.Groups[1].Value);
            }
        }
    }

這將捕獲數字部分,同時丟棄EAN前綴

試試這個正則表達式字符串。 \\b =單詞邊界和| 確保它只匹配8或13,而不能匹配介於兩者之間的任何數字:

\\b\\d{8}\\b|\\b\\d{13}\\b

如果您不想使用Unicode數字,請使用字符類,而不要使用快捷方式\\ d(這要快得多)

\b(?:[0-9]{8}|[0-9]{13})\b

我設法炮制此:

\b(([Ee][Aa][Nn])?[_]?([0-9]{13}|[0-9]{8}))\b
  1. 這部分([Ee][Aa][Nn])? 對不區分大小寫的序列EAN進行分組,並使其與?可選?
    1. 然后[_]? 使下划線為可選。 為了美化起見,我加了方括號
    2. 這些數字使用其字符表示形式[0-9]{13}[0-9]{8}進行標識
    3. 一切都包裹在\\b( ... )\\b塊中以標識單詞邊界
    4. 這兩種EAN類型用括號括起來,並用OR |分隔|

下面是來自http://regexpal.com/的屏幕截圖,顯示了測試集和匹配項。

regexpal.com的屏幕快照,顯示了測試集和匹配項。

豪爾赫,我必須說我不喜歡重復代碼(或其他與此有關的東西:D)。 因此,我不是很喜歡整個([Ee][Aa][Nn])?[_]? 出現兩次。 此外,如果明天您想尋找EAN5,則必須進一步復制它,而regexp變得越來越難看。


這是我清理之前的內容:

\b(([Ee][Aa][Nn])?[_]?[0-9]{13}|([Ee][Aa][Nn])?[_]?[0-9]{8})\b

下面是來自http://regexpal.com/的屏幕截圖,顯示了測試集和匹配項。

regexpal.com的屏幕快照,顯示了測試集和匹配項。

暫無
暫無

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

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