2010-07-25 15 views
5

Powiedz, że mam długi ciąg tekstu i chcę uchwycić za każdym razem, gdy słowo this jest wymienione w nawiasach okrągłych. Jak mogłem to zrobić? Poniższy wzór tylko odpowiada pierwszy this ignorując wszystkie wystąpienia po:Regex rejestruje każde wystąpienie wyrazu w obrębie dwóch ograniczników.

/\(.*(this).*\)/g 

na przykład za pomocą wzoru powyżej w następującym tekście:

Etiam scelerisque, Nunc ac egestas consequat (odio ten nibh euismod nulla, eget auctor orci nibh vel to nisi .Aququam to erat volutpat).

Zwróci tylko pierwszy this po słowie odio.

Co robię źle?

+0

w wartości nominalnej, nie widzę nic złego z tego wzoru ... pisać kod używasz go w –

+0

OK, więc w twoim przykładowym tekście są 3 "to". Więc jaki jest oczekiwany wynik? Czy chcesz liczbę liczby "to" w tych nawiasach? A może chcesz tylko zwrócić to, co jest pomiędzy tymi nawiasami? opisz wyraźnie, co chcesz jako wyjściowy – ghostdog74

+0

+1 propter uti lingua latina. :) – danlei

Odpowiedz

6

Po pierwsze, nie bądź chciwy.

/\(.*?(this).*?\)/g

Po drugie, jeśli celem jest policzyć liczbę wystąpień „to”, regex prawdopodobnie nie jest właściwym narzędziem tutaj. Problem polega na tym, że musisz dopasować separator zamykający, aby ustalić, że pierwsze "to" jest zamknięte, co oznacza, że ​​kontynuowanie stosowania wyrażeń regularnych nie będzie pasować do niczego w tym już zużytym zestawie ograniczników.

regex Mam powyżej złapie rzeczy jak:

foo (baz this bar) (foo this)

lecz nie (będą pasować tylko dwa razy, raz dla każdego zestawu ograniczników):

foo (this this bar) baz (this this this)

Try za pomocą prostego skanera jednoprzebiegowego zamiast wyrażenia regularnego. Inną alternatywą jest użycie dwóch wyrażeń regularnych, jednego do oddzielenia ciągu w sekcjach zamkniętych i niezamkniętych, a drugiego do wyszukiwania wewnątrz zamkniętych regionów.

1

użycie znaku .* spowoduje dopasowanie każdego znaku w ciągu wyszukiwania. Więc to, co tu robisz, jest chciwie pasujące do wszystkiego przed i po pierwszym wystąpieniu w nawiasie. Bieżące wyniki mecz prawdopodobnie wyglądać trochę jak następuje:

["(odio this nibh euismod nulla, eget auctor orci nibh vel this nisi. Aliquam this erat volutpat)", "this"] 

Jeżeli pierwszy element w tablicy jest cały podciąg dopasowany przez wyrażenie, a wszystko, co następuje są ujęte w wartości Twojego regex.

Jeśli chcesz dopasować każde wystąpienie this wewnątrz nawiasów, jednym rozwiązaniem byłoby najpierw uzyskać podciąg wszystko wewnątrz nawiasów, a następnie szukać this w tym podciągu:

# Match everything inside the parentheses 
/\([^\)]*\)/ 

# Match all occurrences of the word 'this' inside a substring 
/this/g 
0

I wdrożone regex, aby zamknąć wszystkie znaki alfanumeryczne za pomocą wyrażeń regularnych poniżej:

# cat testfile 
aabc a1 +++ xyz 20 30 =40 -r 
# cat testfile | sed -e "s/\([[:alnum:]]\{1,\}\)/<pre>\1<post>/g" 
<pre>aabc<post> <pre>a1<post> +++ <pre>xyz<post> <pre>20<post> <pre>30<post> =<pre>40<post> -<pre>r<post> 
# 

Mam nadzieję, że pomoże.

Powiązane problemy