2016-07-15 10 views
-1

Ich schreibe wenig Rails api Anwendung, und ich brauche Zeichenfolge zu analysieren, Worte zu finden gegebene Zeichenkette mit wie:Wörter einschließlich gegebenen String in Ruby

mein Quelltext Angenommen hello mr one two three four nine nineteen ist und ich möchte Auftreten von on überprüfen , wird es produzieren: one, und wenn ich das Auftreten von ne t in der gleichen Zeichenfolge überprüfen wird es one two ergeben.

Ich weiß, es gibt einen hässlichen Weg mit Teilstrings, zählen Positionen und Parsing String auf diese Weise, aber ich denke, dass es mit Regex-Scan gelöst werden kann.

Bitte sagen Sie, wenn Sie zusätzliche Informationen benötigen, danke.

Antwort

3
▶ str = 'hello mr one two three four nine nineteen' 
#⇒ "hello mr one two three four nine nineteen" 
▶ re = ->(pattern) { /\p{L}*#{pattern}\p{L}*/ } 
▶ str[re.('ne t')] 
#⇒ "one two" 
▶ str[re.('on')] 
#⇒ "one" 

Matcher \p{L} ist in der Regel besser als \w und, vor allem, \S weil sie paßt alle utf-8 Buchstaben.

Um auch Umlaute zu entsprechen (i. E in „naiv“ kombiniert.) Eine linke und rechte Matcher erweitert werden soll:

▶ re = ->(pattern) { /[\p{L}\p{Mc}]*#{pattern}[\p{L}\p{Mc}]*/ } 

Bitte beachten Sie, darüber Code das erste Spiel zurückzukehren. Um alle Spiele zurückzukehren, verwenden Sie String#scan statt String#[]:

▶ str.scan re.('ni') 
#⇒ ["nine", "nineteen"] 
+0

danke, es ist genau das, was ich brauchte! – AndreyS

+0

... oder eine Methode einfügen: 'def match (str, pattern); str [/ [\ p {L} \ p {Mc}] * # {Muster} [\ p {L} \ p {Mc}] * /]; Ende. (я тоже) –

+0

Danke, Cary, schätze es! – mudasobwa

0

Verwenden Sie einen regulären Ausdruck:

search = "on" 
/\s([^\s]*#{search}.[^\s]*)\s/.match("hello mr one two three four nine nineteen")[1] 
# returns "one" 

search = "ne t" 
/\s([^\s]*#{search}.[^\s]*)\s/.match("hello mr one two three four nine nineteen")[1] 
# returns "one two" 

Die Funktionsweise ist es den Teil findet für Sie suchen, und dann Gruppen zusätzliche Zeichen, die an das Enden der Teilkette gebunden sind, in den ersten Leerzeichen stoppen an beiden Enden.

+1

'[^ \ s]' ist als '\ S' geschrieben werden, und Ihre Lösung wird Zeichensetzung entsprechen, wie Kommas, Punkte usw. Abgesehen davon, Wörter am Anfang der Zeichenfolge ("Hallo" im Beispiel) und Wörter, die die Zeichenfolge beenden ("Neunzehn"), stimmen nicht überein. Diese Lösung ist jedoch weder robust noch richtig. – mudasobwa

Verwandte Themen