Udostępnij przez


Wyrażenia regularne

Funkcje IsMatch,Match i MatchAll służą do wyodrębniania i sprawdzania poprawności wzorców w tekście. Wzorzec, którego używają, nazywa się wyrażeniem regularnym.

Wyrażenia regularne są potężne i wszechstronne. Czasami jednak mogą pojawiać się jako losowa sekwencja znaków interpunkcyjnych. Ten artykuł nie opisuje wszystkich aspektów wyrażeń regularnych, ale w Internecie dostępnych jest wiele informacji, samouczków i narzędzi.

Wyrażenia regularne mają długą historię i są dostępne w wielu językach programowania. Każdy język programowania ma swój własny zbiór wyrażeń regularnych i istnieje kilka standardów. Na tyle, na ile to możliwe, dążymy do tego, aby to samo wyrażenie regularne dawało ten sam wynik we wszystkich Power Fx implementacjach. Kompatybilność nie jest łatwa do osiągnięcia, ponieważ Power Fx działa na JavaScript i .NET, które mają znaczące różnice. Aby działać na różnych platformach, Power Fx wyrażenia regularne używają podzbioru funkcji szeroko obsługiwanych w całej branży.

W związku z tym niektóre wyrażenia regularne, które działają w innych środowiskach, mogą być zablokowane lub wymagać dostosowania Power Fx. Błędy czasu tworzenia są zgłaszane w przypadku napotkania nieobsługiwanych funkcji. Z tego powodu wyrażenie regularne i opcje muszą być stałą czasu tworzenia, a nie dynamiczną, tak jak są podane w zmiennej.

Notatka

Power Apps Używa wcześniejszej wersji wyrażeń Power Fx regularnych, która ma mniej ograniczeń, ale także mniej funkcji. MatchOptions.DotAll i MatchOptions.FreeSpacing nie są dostępne, a definicje Match.Email i Match.Hyphen są różne. Pary zastępcze Unicode nie są traktowane jako pojedynczy znak. MatchOptions.NumberedSubMatches jest wartością domyślną. Opisana tutaj wersja wyrażeń regularnych będzie dostępna wkrótce Power Apps , pod przełącznikiem "Power Fx Zgodność z V1.0".

Obsługiwane funkcje

Power Fx Obsługuje następujące funkcje wyrażeń regularnych, z uwagami na temat tego, jak Power Fx zachowanie może różnić się od innych systemów.

Wyrażenie regularne musi być stałe i nie może być obliczane ani przechowywane w zmiennej. Obsługiwany & jest operator, interpolacja $"{...}" ciągów i funkcje the,oraz ConcatenateCharUniChar ze stałymi argumentami.

Znaki literału

Funkcja Podpis
Znaki literału Bezpośrednio można wstawić dowolny znak Unicode, z wyjątkiem,,, \[,, ]^$.|?*+(){} W przypadku korzystania z MatchOptions.FreeSpacing, #, , i inne \s znaki spacji muszą być zmienione, ponieważ mają inne znaczenie.
Znaki literału ucieczki \ (ukośnik odwrotny), po którym następuje jeden z bezpośrednich znaków literału, na przykład \? w celu wstawienia znaku zapytania. \# i \ może być również używany nawet wtedy, gdy MatchOptions.FreeSpacing jest wyłączony w celu zapewnienia spójności.
Kody znaków szesnastkowych i Unicode \x20 z dokładnie dwiema cyframi szesnastkowymi, \u2028 z dokładnie czterema cyframi szesnastkowymi i może być używany dla wysokich i niskich substytutów.
Punkt kodowy Unicode \u{01F47B} z maksymalnie ośmioma cyframi szesnastkowymi. Musi mieścić się w zakresie od 0 do U+10FFFF i nie może być używany ani dla wysokiego, ani niskiego substytutu. Może spowodować powstanie pary zastępczej (dwóch znaków), jeśli jest większa niż U+FFFF.
Powrót karetki \r, tak samo jak Char(13).
Znak nowego wiersza \n, tak samo jak Char(10).
Kanał informacyjny formularza \f, tak samo jak Char(12).
Zakładka Pozioma \t, tak samo jak Char(9).

Użyj \x lub \u zamiast. Kody ósemkowe dla znaków, takich jak \044 or \o{044} , są niedozwolone, ponieważ mogą być niejednoznaczne z numerowanymi odwołaniami wstecznymi.

\v nie jest obsługiwana, ponieważ jest niejednoznaczna w różnych językach wyrażeń regularnych. Służy \x0b do pionowego tabulatora lub [\x0b\f\r\n\x85\u2028\u2029] pionowego odstępu.

Potwierdzeń

Asercje pasują do określonej pozycji w tekście, ale nie zajmują żadnych znaków.

Funkcja Podpis
Początek linii ^, dopasowuje początek tekstu lub wiersza, jeśli jest używana wartość MatchOptions.Multiline .
Koniec linii $, dopasowuje koniec tekstu lub wiersza, jeśli jest używana MatchOptions.Multiline .
Wyprzedzenia (?=a) i (?!a) dopasowuje się do wzorca.
Spojrzenie za siebie (?<=b) i (?<!b) dopasowuje się do wzoru.
Podziały wyrazów \b i \B przy użyciu definicji liter [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}] Unicode.

$ Dopasowuje koniec wiersza, łącznie z końcowym ciągiem \r\n, \r, lub \n.

Asercje wyprzedzające i wyprzedzające nie mogą zawierać dopasowań podrzędnych ani nieograniczonej liczby kwantyfikatorów wewnątrz i nie mogą być używane z kwantyfikatorem na zewnątrz.

Klasy postaci

Funkcja Podpis
Kropka ., pasuje do wszystkiego z wyjątkiem \r i chyba że \n jest używana MatchOptions.DotAll .
Klasa znaku [abc] lista postaci, [a-fA-f0-9] zakres znaków, [^a-z] wszystko oprócz tych znaków. Klasy znaków nie mogą być zagnieżdżane, odejmowane ani przecinane, a wiele znaków interpunkcyjnych nie może pojawiać się dwa razy z rzędu (@@, %%, !!, itp.).
Znaki programu Word \w i \W przy użyciu definicji liter [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}] Unicode. \W Nie może być użyty w negatywnej klasie znaków.
Cyfry \d Zawiera cyfry 0 do i,dopasowuje9\p{Nd} wszystko oprócz znaków dopasowanych przez \D\d. \D Nie może być użyty w negatywnej klasie znaków.
Znaki spacji \s Zawiera znaki [ \t\n\x0b\f\r\x85\u2028\u2029\p{Z}] odstępów, \S które pasują do wszystkiego z wyjątkiem znaków dopasowanych przez \s. \S Nie może być użyty w negatywnej klasie znaków.
Kategoria znaków Unicode \p{Ll} dopasowuje wszystkie małe litery Unicode, podczas gdy \P{Ll} dopasowuje wszystko, co nie jest małą literą Unicode. \P{} Nie może być użyty w negatywnej klasie znaków.

Aby zwiększyć przejrzystość i uniknąć niejednoznaczności, klasy znaków nawiasów kwadratowych są bardziej restrykcyjne niż w innych językach wyrażeń regularnych:

  • Znaki łącznika literału muszą być poprzedzone znakiem ucieczki. Użyj [\-a] zamiast [-a] aby dopasować - lub a.
  • Początkowe nawiasy kwadratowe muszą być poprzedzone zmianą znaczenia. Użyj [\[a] zamiast [[] aby dopasować [ lub a.
  • O ile nie jest to pierwszy znak wskazujący na przeczeń, znak musi zostać zmieniony na znak ucieczki. Użyj [a\^] zamiast [a^] aby dopasować ^ lub a.
  • Nawiasy klamrowe muszą być poprzedzone ucieczką. Użyj [\{\}] , aby dopasować { lub }.
  • Pusta klasa [] znaku nie jest obsługiwana. Aby dołączyć zamykający nawias kwadratowy do klasy znaku, należy go poprzedzić.

Kategorie znaków Unicode obsługiwane przez \p{} i \P{}:

  • Litery: L, Lu, Ll, Lt, Lm, Lo
  • Znaki: M, Mn, Mc, Me
  • Liczby: N, Nd, Nl, No
  • Interpunkcja: P, Pc, Pd, Ps,, PePi, Pf,, Po
  • Symbolika: S, Sm, Sc, Sk, So
  • Separatory: Z, Zs, Zl, Zp
  • Formant i format: Cc, Cf, podczas gdy inne C kategorie prefiksów nie są obsługiwane.

\W, \D, \S, i \P{} nie może być używany w zanegowanej klasie [^...] znaku. Aby można je było zaimplementować na niektórych platformach, te negatywne klasy znaków są tłumaczone na ich odpowiedniki w Unicode, co może być trudne do wykonania, jeśli również zostaną zanegowane.

Znaki Unicode między U+10000 i U+10FFFF, wymagające par zastępczych, nie są obsługiwane w klasach znaków.

Kwantyfikatory

Funkcja Podpis
Chciwy zero lub jedynka ? Dopasowuje zero lub jeden raz, z jak największym dopasowaniem.
Chciwy zero lub więcej * Dopasowuje zero lub więcej razy, z jak największym dopasowaniem.
Chciwy jeden lub więcej + dopasowuje się jeden lub więcej razy, z jak największym dopasowaniem.
Chciwy co najmniej n {n,} Dopasowuje co najmniej n razy, z jak największym dopasowaniem. Na przykład a{3,} dopasowuje wszystkie znaki aaaaa.
Chciwość między n a m {n,m} Mecze między N i M razy, z jak największym dopasowaniem. Na przykład dopasowuje a{1,3} pierwsze trzy znaki aaaaa.
Leniwe zero lub jedynka ?? Dopasowuje zero lub jeden raz, z jak najmniejszym dopasowaniem.
Leniwe zero lub więcej *? Dopasowuje zero lub więcej razy, z jak najmniejszym dopasowaniem.
Leniwy jeden lub więcej +? Dopasowuje jeden lub więcej razy, z jak najmniejszym dopasowaniem.
Leniwy co najmniej n {n,}? Dopasowuje co najmniej n razy, z jak najmniejszym dopasowaniem. Na przykład dopasowuje a{3,}? tylko pierwsze trzy znaki aaaaa.
Leniwy między n a m {n,m}? Mecze między N i M razy, z jak najmniejszym dopasowaniem. Na przykład dopasowuje a{1,3}? tylko pierwszy znak. aaaaa
Dokładny n {n} pasuje dokładnie n razy. Na przykład dopasowuje a{3} dokładnie trzy znaki aaaaa.

Kwantyfikatory dzierżawcze nie są obsługiwane.

Mieszanie dopasowań podrzędnych i kwantyfikatorów ma ograniczenia. Aby uzyskać więcej informacji, zobacz Potencjalnie puste dopasowania podrzędne.

Grupy

Funkcja Podpis
Grupowy ( i ) służą do grupowania elementów dla kwantyfikatorów, które mają zostać zastosowane. Na przykład (abc)+ zapałki abcabc.
Przemiana a|b Pasuje do "a" lub "b", często używanych w grupie.
Nazwane dopasowanie podrzędne i odwołanie wsteczne (?<name>chars) Przechwytuje poddopasowanie z nazwą name, do \k<name> której się odwołuje. Nie można użyć, jeśli MatchOptions.NumberedSubMatches jest włączona.
Numerowane poddopasowanie i odniesienie wsteczne Gdy MatchOptions.NumberedSubMatches jest włączona, przechwytuje poddopasowanie, (a) do którego \1 odwołuje się odwołanie.
Grupa nieprzechwycona (?:a)tworzy grupę bez przechwytywania wyniku jako nazwanego lub numerowanego dopasowania podrzędnego. Wszystkie grupy nie są przechwytywane, chyba że jest włączona opcja MatchOptions.NumberedSubMatches .

Nazwanych i ponumerowanych dopasowań podrzędnych nie można używać razem. Domyślnie nazwane poddopasowania są włączone i preferowane ze względu na przejrzystość i łatwość konserwacji, podczas gdy standardowe grupy przechwytywania stają się grupami bez przechwytywania o zwiększonej wydajności. To zachowanie można zmienić za pomocą polecenia MatchOptions.NumberedSubMatches , które zapewnia tradycyjne grupy przechwytywania, ale wyłącza nazwane grupy przechwytywania. Niektóre implementacje traktują kombinację numerowanych i nazwanych grup przechwytywania w różny sposób, dlatego Power Fx nie zezwalają na to.

Grupy przechwytywania odwołujące się do siebie nie są obsługiwane, na przykład wyrażenie (a\1) regularne.

Dwie grupy przechwytywania nie mogą mieć tej samej nazwy, na przykład wyrażenie (?<id>\w+)|(?<id>\d+) regularne nie jest obsługiwane.

Nazwa nazwanego poddopasowania musi zaczynać się od \p{L} znaku lub _ i może być kontynuowana z tymi znakami plus \p{Nd}. Długość nazw jest ograniczona do 62 jednostek kodu UTF-16.

Odwołania wsteczne do potencjalnie pustych poddopasowań i do poddopasowań w ramach spojrzenia wstecz lub spojrzenia w przyszłość również nie są obsługiwane.

Niektóre implementacje oferują opcję "jawnego przechwytywania" w celu poprawy wydajności, która jest niepotrzebna Power Fx , ponieważ jest to opcja domyślna. MatchOptions.NumberedSubMatches wyłącza ją i umożliwia niejawnie numerowane przechwytywania.

Mieszanie dopasowań podrzędnych i kwantyfikatorów ma ograniczenia. Aby uzyskać więcej informacji, zobacz Potencjalnie puste dopasowania podrzędne .

Komentarze

Funkcja Podpis
Komentarze w tekście (?# comment here), który jest ignorowany jako komentarz. Komentarz kończy się następnym nawiasem zamykającym, nawet jeśli w komentarzu znajduje się nawias otwierający.

Zobacz MatchOptions.FreeSpacing , aby uzyskać alternatywę dla formatowania i komentowania wyrażeń regularnych.

Opcje wbudowane

Funkcja Podpis
Opcje wbudowane (?im) jest taki sam jak w przypadku korzystania z MatchOptions.IgnoreCase i MatchOptions.Multiline. Musi być ustawione na początku wyrażenia regularnego.

Obsługiwane tryby wbudowane to [imsx]. Odpowiadają one odpowiednio MatchOptions.IgnoreCase,MatchOptions.Multiline,MatchOptions.DotAll i MatchOptions.FreeSpacing. n jest również akceptowany ze względu na zgodność, ale nie ma wpływu, ponieważ jest domyślny i jest niezgodny z MatchOptions.NumberedSubMatches.

Opcji wbudowanych nie można używać do wyłączania opcji ani ustawiania opcji dla podwyrażenia.

Opcje

Opcje dopasowania zmieniają zachowanie dopasowywania wyrażeń regularnych. Istnieją dwa sposoby włączania opcji, które można mieszać, o ile nie ma konfliktu:

  • Wartość wyliczenia MatchOptions przekazywana jako trzeci argument do Match, MatchAll i IsMatch. Opcje można łączyć np & . z napędem Concatenate lub MatchOptions.DotAll & MatchOptions.FreeSpacingfunkcją. Wszystkie funkcje wyrażeń regularnych wymagają, aby MatchOptions była wartością stałą, nie można jej obliczać ani przechowywać w zmiennej.
  • (?...) prefiks na samym początku wyrażenia regularnego. Opcje można na przykład (?...) łączyć z wieloma literami (?sx)w konstrukcji. Niektóre opcje nie mają odpowiednika (?...) , ale mogą mieć inne sposoby uzyskania tego samego efektu, na przykład MatchOptions.BeginsWith jest odpowiednikiem ^ na początku wyrażenia regularnego.

Zawiera

Włączone z MatchOptions.Contains bez odpowiednika tekstu wyrażenia regularnego. MatchOptions.Contains jest wartością domyślną dla wszystkich funkcji poza obiektem Power Apps; w Power Apps obrębie MatchOptions.Complete jest wartością domyślną dla funkcji IsMatch.

Zakończony

Włączone za pomocą MatchOptions.Complete lub use ^ i $ na początku oraz wyrażenia regularnego, odpowiednio.

BeginsWith

Włączone za pomocą MatchOptions.BeginsWith lub użyj ^ na początku i wyrażenia regularnego.

EndsWith

Włączone za pomocą MatchOptions.EndsWith lub użyj $ na końcu wyrażenia regularnego.

Kropka Wszystko

Włączone za pomocą MatchOptions.DotAll lub (?s) na początku wyrażenia regularnego.

Zwykle operator kropki . dopasowuje wszystkie znaki z wyjątkiem znaków [\n\x0b\f\r\x85\u2028\u2029] nowego wiersza. Modyfikator DotAll umożliwia dopasowywanie wszystkich znaków, w tym znaków nowej linii.

W tym przykładzie tylko "Hello" jest dopasowane, ponieważ domyślnie . nie będzie pasować do nowego wiersza:

Trim( Match( "Hello
              World", ".*" ).FullMatch )
// returns 
// "Hello"

Ale jeśli dodamy modyfikator DotAll , to nowy wiersz i wszystkie kolejne znaki są dopasowywane:

Trim( Match( "Hello
              World", ".*", MatchOptions.DotAll ).FullMatch )
// returns 
// "Hello
// World"

Swobodne odstępy

Włączone za pomocą MatchOptions.FreeSpacing lub (?x) na początku wyrażenia regularnego.

Swobodne odstępy ułatwiają odczytywanie i utrzymywanie złożonych wyrażeń regularnych. Zasady są proste:

  • Znaki spacji są ignorowane w wyrażeniu regularnym, w tym wszystkie pasujące \s znaki. Jeśli pożądane jest dopasowanie spacji, użyj \s, \ , \t, \r, lub \n.
  • # rozpoczyna komentarz, który jest uruchamiany do końca wiersza. To i wszystkie znaki, które następują po następnym znaku nowego wiersza (znaki nie są dopasowane do . bez MatchOptions.DotAll) są ignorowane.
  • Klasy postaci nie są objęte tymi zmianami. Rozmieść postacie i # działaj tak, jak zwykle. Na przykład,zwraca IsMatch( "a#b c", "(?x)a[ #]b[ #]c" ) wartość true. Niektóre języki wyrażeń regularnych zawierają klasy znaków w swobodnych odstępach lub udostępniają opcję ich dołączania, ale Power Fx tego nie robi.

Na przykład, oto złożone wyrażenie regularne służące do dopasowywania daty i godziny ISO8601:

IsMatch( 
    "2025-01-17T19:38:49+0000",
    "^\d{4}-(0\d|1[012])-([012]\d|3[01])(T([01]\d|2[0123]):[0-5]\d(:[0-5]\d(\.\d{3})?)?(Z|[\-+]\d{4}))?$"
)
// returns true

A oto identyczne wyrażenie regularne z wolnymi odstępami wykorzystującymi wiele wierszy, wcięcia dla grup i komentarze do wyrażeń regularnych, dzięki czemu ta wersja jest łatwiejsza do zrozumienia, walidacji i utrzymania.

IsMatch( "2025-01-17T19:38:49+0000", 
    "(?x)                 # enables free spacing, must be very first
    ^                     # matches from beginning of text
    \d{4}                 # year (0000-9999)
    -(0\d|1[012])         # month (00-12)
    -([012]\d|3[01])      # day (00-31, range not checked against month)
    (T([01]\d|2[0123])    # optional time, starting with hours (00-23)
      :[0-5]\d            # minutes (00-59)
      (:[0-5]\d           # optional seconds (00-59)
        (\.\d{3})?        # optional milliseconds (000-999)
      )?
      (Z|[\-+]\d{4})      # time zone
    )?
    $                     # matches to end of text
    "
)
// returns true

Ignoruj wielkość liter

Włączone za pomocą MatchOptions.IgnoreCase lub (?i) na początku wyrażenia regularnego.

Dopasowuje tekst w literze bez uwzględniania wielkości liter: wielkie litery pasują do małych liter, a małe litery pasują do wielkich liter.

Na przykład:

IsMatch( "HELLO!", "hello", MatchOptions.IgnoreCase )
// returns true

IsMatch( "file://c:/temp/info.txt", "^FILE://", MatchOptions.IgnoreCase )
// returns true

Większość części lub Power Fx jest świadoma kultury, ale nie tutaj. Używanie niezmiennego dopasowania kulturowego jest standardem branżowym dla wyrażeń regularnych, w tym w JavaScript i Perl. Jest to przydatne w drugim przykładzie, w którym zasób systemowy jest dopasowywany, na przykład w kulturze tr-TR , w której I nie jest odpowiednikiem wielkich liter. i

Jeśli potrzebne jest dopasowanie bez uwzględniania wielkości liter świadomej kultury, zamiast tego użyj klasy characters z pasującymi znakami, na przykład [Hh][Ee][Ll][Ll][Oo] w pierwszym przykładzie.

Wiele wierszy

Włączone za pomocą MatchOptions.Multiline lub (?m) na początku wyrażenia regularnego.

Zwykle ^$ kotwice pasują do początku i tekstu wejściowego. W przypadku modyfikatora Multiline te kotwice dopasowują początek i koniec wierszy w tekście wejściowym, gdzie każdy wiersz kończy się znakiem \r, \n, \r\nlub końcem danych wejściowych. Na przykład:

MatchAll( "Hello" & Char(13) & Char(10) & "World", "^.+$" )
// returns 
// "Hello"

Wstępnie zdefiniowane wzorce

Predefiniowane wzorce umożliwiają dopasowanie jednego z zestawu znaków lub sekwencji wielu znaków. Użyj operatora łączenia ciągów, aby połączyć ciągi tekstowe z elementami członkowskimi wyliczenia Match :

Dopasowane elementy typu wyliczeniowego Podpis Wyrażenie regularne
Jakikolwiek Zastępuje dowolny znak. .
Przecinek Dopasowuje przecinek ,. ,
Cyfra Dopasowuje pojedynczą cyfrę (0 through 9 i inne elementy członkowskie \p{Nd}). \d
Poczta e-mail Dopasowuje adres e-mail zawierający symbol "at" (@) i nazwę domeny, która zawiera co najmniej jedną kropkę (.), rozdzieloną białymi znakami i znakami interpunkcyjnymi. Zobacz notatkę
Łącznik Zastępuje łącznik. - Zobacz notatkę
LeftParen Pasuje do lewego nawiasu (. \(
Litera Zastępuje literę. \p{L}
Wielocyfrowe Zastępuje co najmniej jedną cyfrę. \d+
Wiele liter Zastępuje co najmniej jedną literę. \p{L}+
MultipleNonSpaces (Wiele nie-spacji) Zastępuje co najmniej jeden znak, który nie dodaje odstępu (nie spacja, nie znak tabulacji, ani nie nowy wiersz). \S+
Wiele przestrzeni Zastępuje co najmniej jeden znak, który dodaje odstęp (spacja, znak tabulacji lub nowy wiersz). \s+
Niespacja Zastępuje jeden znak, który nie dodaje odstępu. \S
Cyfry opcjonalne Zastępuje zero lub dowolną liczbę cyfr. \d*
Listy opcjonalne Zastępuje zero lub dowolną liczbę liter. \p{L}*
OptionalNonSpaces (OpcjonalnePrzestrzenie) Zastępuje zero lub dowolną liczbę znaków, które nie dodają odstępów. \S*
Przestrzenie opcjonalne Zastępuje zero lub dowolną liczbę znaków, które dodają odstępy. \s*
Period Dopasowuje kropkę lub kropkę .."). \.
RightParen Dopasowuje prawy nawias ). \)
Przestrzeń Zastępuje znak, który dodaje odstęp. \s
Tab Zastępuje znak karty. \t

Na przykład wzorzec "A" i Match.MultipleDigits pasuje do litery "A", po której następuje co najmniej jedna cyfra.

Wzór Match.Email jest bardziej złożony niż pozostałe. Wykrywa i wyodrębnia typowe adresy e-mail w formularzu local@hostname.tld, prawdopodobnie z długich fragmentów tekstu, oraz obsługuje międzynarodowe znaki i emotikony. Użyj go, aby sprawdzić poprawność formularza, który przyjmuje adres e-mail jako dane wejściowe, jako szybki test, czy dane wejściowe znajdują się w formularzu wiadomości e-mail. Jeśli nie wyodrębniasz danych, użyj polecenia MatchOptions.Complete , aby wykryć adres e-mail, na przykład w kontrolce wprowadzania tekstu.

Jednak Match.Email nie sprawdza, czy adres e-mail jest zgodny ze wszystkimi z wielu zmieniających się standardów adresów e-mail, nazw domen i domen najwyższego poziomu, które wymagałyby skomplikowanego wyrażenia regularnego, które musiałoby być od czasu do czasu aktualizowane. Mimo że większość adresów e-mail jest traktowana zgodnie z oczekiwaniami, Match.Email pasuje do niektórych nieprawidłowych wielkości liter, takich jak podkreślenie w nazwie hosta, i nie pasuje do niektórych prawidłowych przypadków, takich jak cytowane adresy e-mail lub adresy IP. W razie potrzeby w sieci dostępnych jest wiele wyrażeń regularnych, które umożliwiają wykrycie naprawdę legalnego adresu e-mail. Zawsze testuj wyrażenie regularne pod kątem konkretnych potrzeb przed użyciem w środowisku produkcyjnym.

Jeśli chcesz wyświetlić użyte wyrażenie regularne, oceń formułę Text( Match.Email ). Pierwsza część dopasowuje znaki przed @ i wyklucza popularne znaki interpunkcyjne ASCII zgodnie z RFC 822 i poprawek oraz znaki interpunkcyjne Unicode rozpoczynające i kończące dla łatwiejszego wyodrębnienia, takie jak (, [, , «, and . Nie obsługuje rzadkiego i odradzanego używania ciągów w cudzysłowie lub komentarzy. Następująca po nim @ druga i trzecia część wyrażenia regularnego są takie same i oddzielone znakiem a ., dzięki czemu w adresie zawsze znajduje się co najmniej jedna . . Te części wykluczają wszystkie znaki interpunkcyjne Unicode z wyjątkiem ., -i i _. Adresy IP nie są obsługiwane. W całym adresie e-mail obsługiwane są znaki międzynarodowe i emotikony.

W Power Apps, gdy nie używasz Power Fx 1.0, Match.Email i Match.Hyphen mają nieco inne definicje. Match.Email jest prostsze, ale nie nadaje się do wyodrębniania adresu e-mail, ponieważ przechwytuje przestrzenie. Wcześniej Match.Hyphen był cytowany poza klasą postaci, co jest teraz nielegalne.

NumerowaneSubDopasowania

Włączone z MatchOptions.NumberedSubMatches bez opcji wbudowanej. (?n) jest obsługiwana jako przeciwieństwo tej opcji w celu zapewnienia zgodności i jest domyślna.

Domyślnie nie przechwytuje, (...) co jest odpowiednikiem tego, co większość systemów nazywa "jawnym przechwytywaniem". Aby przechwycić, użyj nazwanego przechwytywania z (?<name>...) odwołaniem wstecznym \k<name>. Używanie nazwanych ujęć zwiększa wydajność, ponieważ nie przechwytuje grup, które nie są potrzebne, poprawia przejrzystość dzięki użyciu nazw i nie jest podatne na błędy w przypadku zmiany położenia przechwytywania.

Jeśli istnieje wyrażenie regularne, może to zależeć od tego, czy grupy są automatycznie przechwytywane i numerowane, w tym numerowane odwołania wsteczne. To zachowanie jest dostępne przy użyciu opcji MatchOptions.NumberedSubMatches .

Nazwanych i ponumerowanych dopasowań podrzędnych nie można używać razem. Ponieważ niektóre implementacje inaczej traktują kombinację numerowanych i nazwanych grup przechwytywania, Power Fx nie zezwala na to.

Możliwe puste dopasowania podrzędne

Jak wspomniano we wprowadzeniu, Power Fx wyrażenia regularne są celowo ograniczone do funkcji, które można konsekwentnie implementować na platformie .NET, JavaScript i innych silnikach wyrażeń regularnych języka programowania. Błędy czasu tworzenia uniemożliwiają korzystanie z funkcji, które nie są częścią tego zestawu.

Jednym z obszarów, który może się różnić między implementacjami, jest sposób obsługi pustych dopasowań podrzędnych. Rozważmy na przykład wyrażenie (?<submatch>a*)+ regularne, które ma być zgodne z tekstem a. Na platformie .NET dopasowanie podrzędne powoduje pusty ciąg tekstowy, podczas gdy w języku JavaScript powoduje a to. Obie te implementacje można uznać za poprawne, ponieważ + kwantyfikator może być spełniony pustym ciągiem, ponieważ zawartość grupy ma kwantyfikator. *

Aby uniknąć różnych wyników między Power Fx implementacjami, dopasowań podrzędnych, które mogą być puste, nie można używać z kwantyfikatorem. Oto przykłady tego, jak podmecz może być pusty:

Przykłady Podpis
(?<submatch>a{0,}b*)+ Cała zawartość dopasowania podrzędnego jest opcjonalna, więc całe dopasowanie podrzędne może być puste.
((<submatch>a)?b)+ Ze względu na to, że znajduje się ? poza poddopasowaniem, podmecz jako całość jest opcjonalny.
(?<submatch>a|b*)+ Naprzemienne stosowanie w ramach submeczu czegoś, co może być puste, może spowodować, że cały podmecz będzie pusty.
((?<submatch>a)|b)+ Zmiana poza podmeczem może być taka sama b , w takim przypadku podmecz będzie pusty.

Poddopasowanie w (?<submatch>a+)+ nie może być puste, ponieważ musi być co najmniej jedno a w poddopasowaniu i jest obsługiwane.

Unicode

Power Fx wyrażenia regularne używają kategorii Unicode do definiowania \w, \d i \s, z określonymi kategoriami dostępnymi za pośrednictwem \p{..}.

Te definicje mogą się różnić w zależności od platformy. Na przykład standard Unicode jest co jakiś czas aktualizowany o nowe znaki, które później będą implementowane przez platformy we własnym tempie. Spodziewaj się różnic w wynikach między platformami, dopóki wszystkie platformy nie zostaną zaktualizowane.

Power Fx Wyrażenia regularne zapewniają, że informacje o kategorii są zawsze dostępne dla podstawowej płaszczyzny wielojęzycznej (znaki od U+0 do U+ffff). Niektóre platformy nie implementują kategorii dla postaci na dodatkowej płaszczyźnie wielojęzycznej i poza nią (od U+10000 do U+10ffff). To ograniczenie zwykle nie jest problemem, ponieważ znaki w podstawowej płaszczyźnie wielojęzycznej są najczęściej używane. Używaj wartości znaków bezpośrednio zamiast kategorii, jeśli scenariusz obejmuje postacie na poziomie U+10000 lub wyższym. Przetestuj swoje wyrażenia regularne na platformach, z których zamierzasz korzystać.

Między platformami mogą występować niewielkie różnice w przypadkach brzegowych. Na przykład niektóre platformy mogą nie być wyświetlane ſ jako pasujące s po wywołaniu MatchOptions.IgnoreCase . Jeśli te znaki są ważne dla twojego scenariusza, użyj klasy znaku, takiej jak [ſsS] dopasowywanie wielkości liter bez uwzględniania wielkości liter i jawnie dołącz żądane znaki.