[英]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列表中返回相同的值
使用以下正則表達式匹配8
或13
位數字。 \\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
([Ee][Aa][Nn])?
對不區分大小寫的序列EAN進行分組,並使其與?
可選?
[_]?
使下划線為可選。 為了美化起見,我加了方括號 [0-9]{13}
和[0-9]{8}
進行標識 \\b( ... )\\b
塊中以標識單詞邊界 |
分隔|
下面是來自http://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/的屏幕截圖,顯示了測試集和匹配項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.