2016-08-20 6 views
1

Verwenden von Ruby. Hier ein Beispiel:Übereinstimmende verbundene Sätze nach Punkt mit Regex

Die Fahrt kostet E £ 4. Es lohnt sich, eine Fackel zu haben, um schlecht beleuchtete Gebiete zu beleuchten. Die meisten hier beschriebenen Gräber sind normalerweise für Besucher geöffnet. Sie sind aufgelistet in der Reihenfolge, in der sie beim Betreten der Website gefunden werden. Die beste Informationsquelle über die Gräber, ihre Dekoration und Geschichte ist das Theban Mapping-Projekt (www.thebanmappingproject.com). Grab von Ramses VII (KV 1) In der Nähe der Haupteingang ist das kleine, unvollendete Grab von Ramses VII (1136-1129 BC). Nur 44,3 m lang - kurz für ein königliches Grab wegen Ramses 'plötzlichem Tod - es besteht aus einem Korridor, einer Grabkammer und einer unfertigen dritten Kammer.

habe ich versucht, die folgenden, aber es passt zusammen mit dem Buchstaben nächsten Hauptstadt:

/\.[A-Z]/ #=> matches .T instead of . 

Ich möchte:

  • Spiel der Zeitraum . in .Tomb nur - jeder Punkt, der ist gefolgt von einem Großbuchstaben,
  • nicht übereinstimmen .3 in 44.3m,
  • nicht übereinstimmen .t oder .c in www.thebanmappingproject.com.

Antwort

1

haben Sie versucht, ?

/(\.)(?=[A-Z])/g 

es wird passen jeder durch Großbuchstaben gefolgt dot

+0

Was macht 'g'? – Victor

+0

/g Modifikator macht dies nicht nur für den ersten Punkt, sondern alle Punkte gefolgt von Großbuchstaben, in Ihrem Beispiel wird es für 2 Punkte übereinstimmen, nicht nur eine –

+1

@Victor und Sirus: Ruby unterstützt nicht '/ g '. Nur '/ i','/m', '/ x','/o'. Siehe den Abschnitt "Optionen" im Dokument für [Regexp] (http://ruby-doc.org/core-2.3.0/Regexp.html). –

0

Sie waren sehr close.You brauchen nur eine Klammer den Punkt zu entsprechen und die globale Modifikator g EVERY anzupassen durch einen Großbuchstaben gefolgt dot, nicht nur die erste:

/(\.)[A-Z]/g 
+0

Der Großbuchstabe nach der Periode ist nicht Teil des Spiels. Deshalb verwendete Sirius eine positive Vorausschau für den Großbuchstaben. –

1

Wenn text Ihre String,

text.scan(/(\.)[A-Z]/).flatten 
    #=> [".", "."] 

kehrt, was Sie gefragt haben, aber ist das wirklich das, was Sie wollen? Es könnte vorteilhaft sein, zu schreiben

text.scan(/\.[A-Z]/) 
    #=> [".M", ".T"] 

oder

text.gsub(/\.(?=[A-Z])/).with_object([]) { |_,a| a << Regexp.last_match.offset(0).first } 
    #=> [75, 342] 

text[75, 20] 
    #=> ".Most tombs describe" 
text[342, 20] 
    #=> ".Tomb of Ramses VII " 

(20 arbritary ist).

Hier ist die Verwendung von String#gsub interessant. Ich habe gsub verwendet, weil es ohne einen Block einen Enumerator zurückgibt, den ich mit Enumerator#with_object verketten muss. Der von gsub zurückgegebene Wert wird tatsächlich verworfen. Da String#scan ohne Block nicht einen Enumerator zurückgeben, es zu benutzen, schreibe ich haben würde:

a = [] 
text.scan(/\.(?=[A-Z])/) { a << Regexp.last_match.offset(0).first } 
a #=> [75, 342] 

, die kaum das Ende der Welt sein würde.

Verwandte Themen