/ / Wyrażenia regularne i Inline XML - xml, regex, xml-parsing, inline-xml

Wyrażenia regularne i Inline XML - xml, regex, xml-parsing, inline-xml

Mam plik XML Inline (znaczniki xml + tekst). Chcę pobrać 4 słowa przed konkretnym tagiem. Na przykład:

Przypadek 1:

I used to live in <Location>London</Location>.

Przypadek 2:

I work for <Organization> Microsoft Tech.</Organization>
which is in <Location>London</Location>

Chcę pobrać 4 słowa przed tagiem lokalizacji w obu przypadkach.

WYDAJNOŚĆ:

Przypadek 1:

used to live in

Przypadek 2:

</Organizattion> which is in

Czy to możliwe ?? Czy ktoś może mi pomóc?

Odpowiedzi:

1 dla odpowiedzi № 1

Cóż, najłatwiej byłoby:

((?:S+s+){4}s*)<Location>

Zauważ, że nie przyniesie to pożądanego rezultatu w twoim drugim przypadku, ponieważ zakłada, że ​​spacje bez białych znaków są rozdzielane białymi znakami, więc dałoby to Tech.</Organization> which is in tam.


0 dla odpowiedzi nr 2

Chociaż jest to szalone i nie polecam go używać, możesz zrobić coś takiego z awk:

awk "/<Location>/ {n=gensub("(.*)<Location>.*","\1","g",$0); print gensub(".*[ .]([^ .]+ [^ .]+ [^ .]+ [^ .]+) *$","\1","g",n)} " INPUTFILE

Możesz zmodyfikować [^ .] części, aby właściwie zdecydować, co jest częścią słowa.

  1. działa na liniach z <Location>
  2. zapisuje część linii do <Location>
  3. wypisuje cztery słowa, które odnalazł. (Uwaga bez dopasowania wypisze wcześniej zapisaną część linii.)

0 dla odpowiedzi № 3

Wyrażenie, którego potrzebujesz, musi być oparte na pozytywnym wzroku. Dla twoich 2 przypadków następujących prac:

/(?:[<>/w]+s*){4}(?=<Location>)/s

Daj mi znać, jeśli potrzebujesz wersji demo, używając powyższego wyrażenia regularnego.