การอ้างอิงด้านหลังหมายถึงการอ้างอิงกลุ่มที่ตรงกันไปยังตำแหน่งอื่นๆ ในนิพจน์นั้น ตัวอย่างเช่น เมื่อจับคู่แท็ก HTML เราจะจับคู่ <a> และเราต้องเสนอราคากลุ่มที่ตรงกันเพื่อค้นหา </ a> คราวนี้คุณต้องการ เพื่อใช้การอ้างอิงกลับ
ไวยากรณ์
a. หากต้องการย้อนกลับการอ้างอิงกลุ่มที่มีหมายเลข ไวยากรณ์คือ number
b หากต้องการอ้างอิงกลับกลุ่มที่มีชื่อ ไวยากรณ์คือ k<name>
<ตัวอย่าง
ก. จับคู่แท็ก HTML
@"<(?<tag">[^ s>]+)[^>]*>.*</k<tag><>>"
b. จับคู่อักขระสองตัวที่ทับซ้อนกัน
public static void Main()
-
สตริง s = "aabbc11asd";
Regex reg = Regex ใหม่(@"(w)1");
MatchCollection ตรงกัน = reg.Matches;
foreach(จับคู่ m ในการแข่งขัน)
Console.WriteLine (m.Value);
Console.ReadLine();
}
ผลลัพธ์ที่ส่งคืนคือ
กลุ่มการจับคู่เสริม
aa bb 11ตามโครงสร้างกลุ่มต่างๆ รูปแบบในวงเล็บจะไม่ถูกบันทึกเป็นส่วนหนึ่งของผลลัพธ์การจับคู่
1.
ความหมายของคำสั่งเชิงบวก (?=): รูปแบบในวงเล็บต้อง ปรากฏที่ด้านขวาของคำสั่ง แต่ไม่เป็นส่วนหนึ่งของการจับคู่
public static void Main()
-
สตริง s = "C#.net,VB.net,PHP,Java,JScript.net";
Regex reg = Regex ใหม่(@"[w#]+(?=.net)",RegexOptions.Compiled);
MatchCollection mc = reg.การแข่งขัน;
foreach (จับคู่ m ใน mc)
Console.WriteLine (m.Value);
Console.ReadLine();
//เอาต์พุต C# VB JScript
}
คุณจะเห็นว่ากลไกการจับคู่ต้องมี .net แต่ไม่ได้ใส่ .net ในผลลัพธ์ที่ตรงกัน
2. การประกาศเชิงลบ (?!)
ความหมาย: รูปแบบในวงเล็บต้องไม่ปรากฏทางด้านขวาของการ
ประกาศ ตัวอย่างต่อไปนี้สาธิตวิธีการรับ <a>เนื้อหาทั้งหมดในคู่แท็ก แม้ว่าจะมีแท็ก HTML อื่นอยู่ก็ตาม
โมฆะคงที่สาธารณะ Main()
-
string newsContent = @"url:<a href=""1.html""><img src=""1.gif"">test<span style=""color:red;"">Regex</span> </ก>";
Regex regEnd = Regex ใหม่(@"<s*a[^>]*>([^<]|<(?!/a))*<s*/as*>",RegexOptions.Multiline) ;
Console.WriteLine(regEnd.Match(เนื้อหาข่าว).ค่า);
//ผลลัพธ์: <a href="1.html"><img src="1.gif">ทดสอบ<span style="color:red;"><Regex</span></a>
Console.ReadLine();
}
3.
ความหมายของการประกาศเชิงบวกแบบย้อนกลับ (?<=): รูปแบบในวงเล็บต้องปรากฏทางด้านซ้ายของการประกาศ แต่ไม่เป็นส่วนหนึ่งของการจับคู่
4. ความหมายของการประกาศเชิงลบแบบย้อนกลับ (?<!
: รูปแบบในวงเล็บต้องไม่
ไวยากรณ์การจับคู่แบบไม่ย้อนรอย
ปรากฏทางด้านซ้ายของคำสั่ง: (?>)
ความหมาย: หลังจากจับคู่กลุ่มนี้แล้ว อักขระที่ตรงกันจะไม่สามารถใช้จับคู่นิพจน์ที่ตามมาผ่านการย้อนรอยได้ ฮ่าๆ แค่อ่านประโยคนี้ฉันก็คงไม่เข้าใจหรอก ฉันใช้เวลามากมายในการทำความเข้าใจเรื่องนี้ ดังนั้นเรามาอธิบายด้วยตัวอย่างกันดีกว่า:
" www.csdn.net " สามารถจับคู่ได้ด้วย @"w+.(.*).w+" แต่ไม่สามารถจับคู่ด้วย @"w+.(?>.*).w+"! ทำไม
เหตุผลก็คือการจับคู่แบบปกตินั้นมีความโลภมาก เมื่อจับคู่ มันจะจับคู่ผลลัพธ์ให้ได้มากที่สุด ดังนั้น .* ในนิพจน์ทั่วไปทั้งสองในตัวอย่างข้างต้นจะตรงกับ csdn.net โดยสมบูรณ์ ในขณะนี้ นิพจน์แรกคือ ในเมื่อเริ่มจับคู่ จะพบว่า .w+ ไม่มีอักขระที่จะจับคู่ จึงจะย้อนกลับ สิ่งที่เรียกว่าการย้อนกลับคือการย้อนกลับผลลัพธ์ที่ตรงกัน และใช้อักขระที่เหลือจากการย้อนกลับจะถูกใช้เพื่อจับคู่ .w+ ,จนกว่า .w+ จะจับคู่สำเร็จ นิพจน์ทั้งหมดจะส่งกลับผลลัพธ์การจับคู่ที่สำเร็จ นิพจน์ที่สองใช้การจับคู่แบบไม่ย้อนรอย ดังนั้นหลังจากจับคู่ .* แล้ว จะไม่อนุญาตให้จับคู่ .w+ ผ่านการย้อนรอย ดังนั้นนิพจน์ทั้งหมดจึงไม่สามารถจับคู่ได้
โปรดทราบว่าการย้อนรอยเป็นการสิ้นเปลืองทรัพยากร ดังนั้นโปรดพยายามหลีกเลี่ยงการย้อนรอยเพื่อให้ตรงกับนิพจน์ทั่วไปของคุณ ดังตัวอย่างด้านบน คุณสามารถแทนที่ด้วย @"w+.([^.]+ .)+w+"+"