Alternation Constructs in Regular Expressions
Az alternation szerkezetek módosítanak egy reguláris kifejezést, hogy lehetővé tegyék vagy/vagy feltételes egyeztetést tegyenek lehetővé. A .NET három váltakozó szerkezetet támogat:
- Mintaillesztés |
- Feltételes egyeztetés (?( kifejezés)igen|nem)
- Feltételes egyeztetés érvényes rögzített csoport alapján
Mintaegyezés |
A függőleges sáv (|
) karakterrel egyező mintázatok bármelyikét használhatja, ahol a karakter elválasztja az |
egyes mintákat.
A pozitív karakterosztályhoz hasonlóan a |
karakter használható egyetlen karakter bármelyikének egyezésére. Az alábbi példa a karakterrel egyező pozitív karakterosztályt és/vagy mintát használ a |
"szürke" vagy a "szürke" szavak előfordulásának kereséséhez egy sztringben. Ebben az esetben a |
karakter egy olyan reguláris kifejezést hoz létre, amely részletesebb.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
// Regular expression using character class.
string pattern1 = @"\bgr[ae]y\b";
// Regular expression using either/or.
string pattern2 = @"\bgr(a|e)y\b";
string input = "The gray wolf blended in among the grey rocks.";
foreach (Match match in Regex.Matches(input, pattern1))
Console.WriteLine("'{0}' found at position {1}",
match.Value, match.Index);
Console.WriteLine();
foreach (Match match in Regex.Matches(input, pattern2))
Console.WriteLine("'{0}' found at position {1}",
match.Value, match.Index);
}
}
// The example displays the following output:
// 'gray' found at position 4
// 'grey' found at position 35
//
// 'gray' found at position 4
// 'grey' found at position 35
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
' Regular expression using character class.
Dim pattern1 As String = "\bgr[ae]y\b"
' Regular expression using either/or.
Dim pattern2 As String = "\bgr(a|e)y\b"
Dim input As String = "The gray wolf blended in among the grey rocks."
For Each match As Match In Regex.Matches(input, pattern1)
Console.WriteLine("'{0}' found at position {1}", _
match.Value, match.Index)
Next
Console.WriteLine()
For Each match As Match In Regex.Matches(input, pattern2)
Console.WriteLine("'{0}' found at position {1}", _
match.Value, match.Index)
Next
End Sub
End Module
' The example displays the following output:
' 'gray' found at position 4
' 'grey' found at position 35
'
' 'gray' found at position 4
' 'grey' found at position 35
A karaktert |
\bgr(a|e)y\b
használó reguláris kifejezés az alábbi táblázatban látható módon lesz értelmezve:
Minta | Leírás |
---|---|
\b |
Kezdje egy szóhatáron. |
gr |
Egyezik a "gr" karakterekkel. |
(a|e) |
Egyezik az "a" vagy az "e" értékkel. |
y\b |
Egyezik egy "y" szóval egy szóhatáron. |
A |
karakter használható egy vagy több karakterrel vagy alkifejezéssel való egyeztetésre is, amely a karakterkonstansok és a reguláris kifejezés nyelvi elemeinek bármilyen kombinációját tartalmazhatja. (A karakterosztály nem biztosítja ezt a funkciót.) Az alábbi példa egy amerikai társadalombiztosítási szám (SSN) kinyerésére használja a |
karaktert, amely egy 9 jegyű szám, ddd-dd- formátumban, vagy egy egyesült államokbeli munkáltatói azonosítószám (EIN), amely egy 9 jegyű szám, dddddddd- formátumban.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b";
string input = "01-9999999 020-333333 777-88-9999";
Console.WriteLine("Matches for {0}:", pattern);
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine(" {0} at position {1}", match.Value, match.Index);
}
}
// The example displays the following output:
// Matches for \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
// 01-9999999 at position 0
// 777-88-9999 at position 22
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "\b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b"
Dim input As String = "01-9999999 020-333333 777-88-9999"
Console.WriteLine("Matches for {0}:", pattern)
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine(" {0} at position {1}", match.Value, match.Index)
Next
End Sub
End Module
' The example displays the following output:
' Matches for \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
' 01-9999999 at position 0
' 777-88-9999 at position 22
A rendszer a reguláris kifejezést \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b
az alábbi táblázatban látható módon értelmezi:
Minta | Leírás |
---|---|
\b |
Kezdje egy szóhatáron. |
(\d{2}-\d{7}|\d{3}-\d{2}-\d{4}) |
Egyezzen a következők valamelyikével: két tizedesjegy, majd egy kötőjel, majd hét tizedesjegy; vagy három tizedesjegy, egy kötőjel, két tizedesjegy, egy másik kötőjel és négy tizedesjegy. |
\b |
Egy szóhatáron fejezd be az egyezést. |
Feltételes egyeztetés kifejezéssel
Ez a nyelvi elem megkísérli egyezni a két minta egyikét attól függően, hogy megfelel-e egy kezdeti mintának. Szintaxisa:
(?(
kifejezés)
igen)
vagy
(?(
kifejezés)
igen|
nem)
ahol a kifejezés a kezdeti egyeztetendő minta, igen az a minta, amelyet egyezni kell, ha a kifejezés megfeleltetve van, és nem az a választható minta, amelyet akkor kell egyezni, ha a kifejezés nem egyezik (ha nincs megadva minta, akkor az üres nemnek felel meg). A reguláris kifejezésmotor nulla szélességű állításként kezeli a kifejezést, vagyis a reguláris kifejezésmotor nem lép előre a bemeneti adatfolyamban a kifejezés kiértékelése után. Ezért ez a szerkezet egyenértékű a következő konstrukcióval:
(?(?=
kifejezés)
igen|
nem)
ahol (?=
a kifejezés)
nulla szélességű helyességi szerkezet. (További információ:Csoportosítási szerkezetek.) Mivel a reguláris kifejezésmotor a kifejezést horgonyként (nulla szélességű állításként) értelmezi, a kifejezésnek nullaszélességű helyességi feltételnek kell lennie (további információ: Horgonyok) vagy az igenben is található alkifejezés. Ellenkező esetben az igen minta nem egyeztethető.
Feljegyzés
Ha a kifejezés névvel ellátott vagy számozott rögzítési csoport, a váltakozó szerkezetet a rendszer rögzítési tesztként értelmezi. További információt a következő, Feltételes egyeztetés érvényes rögzítési csoporton alapuló szakaszában talál. Más szóval a reguláris kifejezésmotor nem a rögzített részstringnek próbál megfelelni, hanem a csoport jelenlétére vagy hiányára vonatkozó teszteket.
Az alábbi példa a példa egyik változata, amely a (z) | szakaszban látható Vagy mintaegyeztetés | szakaszában jelenik meg. Feltételes egyeztetéssel állapítja meg, hogy a szóhatár utáni első három karakter két számjegyből áll-e, amelyet kötőjel követ. Ha így van, az egyesült államokbeli munkáltatói azonosító számmal (EIN) próbál megegyezni. Ha nem, egy amerikai társadalombiztosítási számmal (SSN) próbál megegyezni.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b";
string input = "01-9999999 020-333333 777-88-9999";
Console.WriteLine("Matches for {0}:", pattern);
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine(" {0} at position {1}", match.Value, match.Index);
}
}
// The example displays the following output:
// Matches for \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
// 01-9999999 at position 0
// 777-88-9999 at position 22
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "\b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b"
Dim input As String = "01-9999999 020-333333 777-88-9999"
Console.WriteLine("Matches for {0}:", pattern)
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine(" {0} at position {1}", match.Value, match.Index)
Next
End Sub
End Module
' The example displays the following output:
' Matches for \b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
' 01-9999999 at position 0
' 777-88-9999 at position 22
A rendszer a reguláris kifejezésmintát \b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b
az alábbi táblázatban látható módon értelmezi:
Minta | Leírás |
---|---|
\b |
Kezdje egy szóhatáron. |
(?(\d{2}-) |
Határozza meg, hogy a következő három karakter két számjegyből és egy kötőjelből áll-e. |
\d{2}-\d{7} |
Ha az előző minta egyezik, egyezzen két számjegyből, majd egy kötőjelből, majd hét számjegyből. |
\d{3}-\d{2}-\d{4} |
Ha az előző minta nem egyezik, egyezik három tizedesjegy, egy kötőjel, két tizedesjegy, egy másik kötőjel és négy tizedesjegy. |
\b |
Egy szóhatár egyeztetése. |
Feltételes egyeztetés érvényes rögzített csoport alapján
Ez a nyelvi elem két minta egyikét próbálja meg egyezni attól függően, hogy megfelelt-e egy adott rögzítési csoportnak. Szintaxisa:
(?(
név)
igen)
vagy
(?(
név)
igen|
nem)
vagy
(?(
szám)
igen)
vagy
(?(
szám)
igen|
nem)
ahol a név a név és a szám egy rögzítési csoport száma, igen, ha a név vagy szám megegyezik, és nem az opcionális kifejezés, amelyet egyezni kell, ha nem (ha nincs megadva minta, akkor az üres nemnek felel meg).
Ha a név nem felel meg a reguláris kifejezésmintában használt rögzítési csoport nevének, a rendszer kifejezéstesztként értelmezi az alternation szerkezetet az előző szakaszban leírtak szerint. Ez általában azt jelenti, hogy a kifejezés kiértékelése a következőre történik false
: . Ha a szám nem felel meg a reguláris kifejezésmintában használt számozott rögzítési csoportnak, a reguláris kifejezésmotor egy ArgumentException.
Az alábbi példa a példa egyik változata, amely a (z) | szakaszban látható Vagy mintaegyeztetés | szakaszában jelenik meg. Egy két számjegyből és egy kötőjelből álló rögzítési csoportot n2
használ. A váltakozó szerkezet ellenőrzi, hogy a rögzítési csoport megfelel-e a bemeneti sztringnek. Ha így van, a váltakozó szerkezet megpróbál megegyezni egy kilencjegyű egyesült államokbeli munkáltatói azonosító szám (EIN) utolsó hét számjegyével. Ha nem, megpróbál megegyezni egy kilencjegyű amerikai társadalombiztosítási számmal (SSN).
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b";
string input = "01-9999999 020-333333 777-88-9999";
Console.WriteLine("Matches for {0}:", pattern);
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine(" {0} at position {1}", match.Value, match.Index);
}
}
// The example displays the following output:
// Matches for \b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b:
// 01-9999999 at position 0
// 777-88-9999 at position 22
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "\b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b"
Dim input As String = "01-9999999 020-333333 777-88-9999"
Console.WriteLine("Matches for {0}:", pattern)
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine(" {0} at position {1}", match.Value, match.Index)
Next
End Sub
End Module
A rendszer a reguláris kifejezésmintát \b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b
az alábbi táblázatban látható módon értelmezi:
Minta | Leírás |
---|---|
\b |
Kezdje egy szóhatáron. |
(?<n2>\d{2}-)? |
Egyezik két számjegy nullával vagy egy előfordulásával, amelyet kötőjel követ. Nevezze el ezt a rögzítési csoportot n2 . |
(?(n2) |
Ellenőrizze, hogy a bemeneti sztring megfelelt-e n2 . |
\d{7} |
Ha n2 megfelelt, hét tizedesjegyet kell egyeznie. |
|\d{3}-\d{2}-\d{4} |
Ha n2 nem egyezett, egyezik három tizedesjegy, egy kötőjel, két tizedesjegy, egy másik kötőjel és négy tizedesjegy. |
\b |
Egy szóhatár egyeztetése. |
Az alábbi példában látható a példában az a változat, amely számozott csoportot használ elnevezett csoport helyett. A reguláris kifejezési minta a \b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b
.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b";
string input = "01-9999999 020-333333 777-88-9999";
Console.WriteLine("Matches for {0}:", pattern);
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine(" {0} at position {1}", match.Value, match.Index);
}
}
// The example display the following output:
// Matches for \b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b:
// 01-9999999 at position 0
// 777-88-9999 at position 22
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "\b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b"
Dim input As String = "01-9999999 020-333333 777-88-9999"
Console.WriteLine("Matches for {0}:", pattern)
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine(" {0} at position {1}", match.Value, match.Index)
Next
End Sub
End Module
' The example displays the following output:
' Matches for \b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b:
' 01-9999999 at position 0
' 777-88-9999 at position 22
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: