/ / perl wyrażenie regularne, aby uzyskać tekst pomiędzy 5) tekstem 6) - regex, perl, dopasowywanie wzorców

perl wyrażenie regularne, aby uzyskać tekst między 5) tekstem 6) - regex, perl, dopasowywanie wzorców

5) W 64-bitowym systemie operacyjnym przejdź do C: Program Files (x86) Common gateway 6) w wersji 32-bitowej

w powyższym przykładzie próbowałem uzyskać tekst między 5) a 6), który jest On 64bit OS go to C:Program Files (x86)Common gateway

napisałem poniżej 5[)]s?(.*?)6[)]s?/i ale to się tu kończy, tak jak ja (x86) więc moje wyrażenie będzie pasować On 64bit OS go to C:Program Files (x8

więc myślałem o dodaniu [^/] więc pominie się x86) ale nie działa ... może ktoś proszę o pomoc.

Odpowiedzi:

1 dla odpowiedzi № 1

Jeśli poprawnie przeczytam to pytanie, chcesz dopasować do 6) chyba że 6) jest częścią ciągu (x86). W takim przypadku użyj negatywnej asercji:

/5)s?(.*?)(?<!(x8)6)s?/i

to znaczy ... dopasować do 6) chyba że tak jest (x86).


1 dla odpowiedzi nr 2

Co powiesz na:

5)(.*?)s6)

Używam białej przestrzeni przed 6) dostać to, czego chcesz, a ta biała przestrzeń nie jest potrzebna w twoim schwytanym łańcuchu, prawda?


0 dla odpowiedzi № 3

Oto kolejna opcja:

use strict;
use warnings;

while (<DATA>) {
my ($text) = /(?:bd+))(.+?)(?:sd+))/;
print "$textn";
}

__DATA__
5) On 64bit OS go to C:Program Files (x86)Common gateway 6) on 32 bit
42)even more text 43)I think
7)Twenty four (24) 8)

Wydajność:

 On 64bit OS go to C:Program Files (x86)Common gateway
even more text
Twenty four (24)

Wyrażenie próbuje najpierw dopasować granicę słowa, a następnie jedną cyfrę +, a następnie prawą stronę, a następnie przechwytuje wszystkie wartości do białych znaków, po których następuje jedna cyfra +, a następnie prawy nagłówek.

Mam nadzieję że to pomoże!


-1 dla odpowiedzi № 4

Usuń kwalifikator "ungreedy".

Innymi słowy, zastąp wzór przechwytywania

(.*?)

z

(.*)

Pierwszy dopasuje tak mało, jak to możliwe. Drugi będzie pasował tak bardzo, jak to możliwe.


-1 dla odpowiedzi № 5

Idź prosto 5)(.*6).*)6) powinien to wszystko załatwić $1. Zamiast wykluczać otaczającą białą przestrzeń w wyrażeniu regularnym, którego użyłbym trim($1).

Jeden problem z próbą dopasowania białej przestrzeni w obrębie wyrażenia regularnego, na przykład z 5)s*(.*6).*)s*6) wie, która część wyrażenia pasuje do spacji przed skrajną prawą 6). Biorąc pod uwagę .*s*6) część robi .* lub s* dopasuj przestrzeń w text 6)? Stąd sugestia użycia wykończenia.