2017-11-11 2 views
1

Ich benutze Ruby 2.1. Ich habe diese Logik, dieWie kann ich feststellen, ob drei oder mehr Zeichen zwischen Übereinstimmungen in einer Regex vorhanden sind?

results = line.scan(/\b((\S+?)\b.*?\b(\S+?))\b/) 

Meine Frage für aufeinanderfolgende Paare von Zeichenketten in einem größeren String aussieht, ist, wie kann ich über die Liste der Ergebnisse iterieren und ausdrucken, ob es drei oder mehr Zeichen zwischen den beiden Strings? Zum Beispiel, wenn meine Zeichenfolge waren

"abc  def" 

Die oben

[["abc  def", "abc", "def"]] 

produzieren würde, und ich würde gerne wissen, ob es drei oder mehr Zeichen zwischen „abc“ und „def.“

+1

Sie beziehen sich auf „drei oder mehr Zeichen zwischen den beiden Strings“ (die mit dem regulären Ausdruck konsistent ist), aber Ihr Beispiel enthält nur Leerzeichen (also ein bestimmtes Zeichen) zwischen den beiden Zeichenfolgen. Das ist verwirrend. –

+0

Ich benutzte ein Beispiel, das meinem Ausdruck entsprach. Ich habe das Wort "Zeichen" anstelle von "Leerzeichen" in meiner Frage verwendet. B/c mein Regex könnte möglicherweise mehr als Leerzeichen entsprechen. Bitte lassen Sie mich wissen, was ich tun kann, um die Frage klarer zu machen. Danke Cary. – Dave

+0

@Dave Was könnte es sonst noch als Leerzeichen geben? – wp78de

Antwort

3

Verwenden Sie einen Quantifizierer für die Räume dazwischen: \b((\S+?)\b\s{3,}\b(\S+?))\b

Auch sind die inneren boundries nicht wirklich nötig: \b((\S+?)\s{3,}(\S+?))\b

+0

Sie ändern meine Regex obwohl. Ich möchte keine Paare ausschließen, die weniger als 3 Zeichen enthalten. Ich möchte nur herausfinden, welche die sind, wenn ich über meine Ergebnismenge iteriere. – Dave

+0

Dave, es ist nicht notwendig, auf Ihre "Ergebnismenge" zu verweisen, um das gewünschte Ergebnis zu erzielen. wp78de extrahiert Zeichenfolgen mit 3 oder mehr Leerzeichen zwischen den beiden Übereinstimmungen (die in Ihrer Ergebnismenge enthalten wären), konsistent mit Ihrem Beispiel. Wenn es "3 oder mehr * Zeichen *" zwischen Übereinstimmungen sein soll, ersetzen Sie '\ s {3,}' durch '. {3,}'. –

+0

@Dave, wenn Sie wirklich diese Route gehen möchten, könnten Sie ein komplexeres Muster wie dieses verwenden, das einen Wert in $ 2 hat, wenn 3 oder mehr Leerzeichen dazwischen liegen: ['\ b (?: (\ W +?) (? : (\ s {3,}) | \ b. *? \ b) (\ w +?)) \ b '] (https://regex101.com/r/v3oG9M/3) – wp78de

0

Eine einfache Möglichkeit zu überprüfen, dies ist durch eine separate regex ausgeführt wird:

results.select!{|x|p x[/\S+?\b(.*?)\b\S+?/,1].size} 

wird die Größe für jeden der Haufen drucken.

Eine andere Möglichkeit ist, die Größe der erfassten Gruppen zu nehmen und sie subtrahieren:

results = [] 
line.scan(/\b((\S+?)\b.*?\b(\S+?))\b/) do |s, group1, group2| 
    results << $~ if s.size - group1.size - group2.size >= 3 
end 
Verwandte Themen