Ich habe eine Stringvariable mit Inhalt:
varMessage =
"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"
"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"
"void::secondFunction(char const&)\n"
.
.
.
"this/is/last/line/liobrary.so"
In der Zeichenfolge muss ich eine Unterzeichenfolge finden:
"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"
"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"
Wie kann ich es finden? Ich muss feststellen, ob der Teilstring vorhanden ist oder nicht.
Antworten:
Sie können die
include?
Methode verwenden:quelle
include?
dies fallempfindlich ist. Wenn alsomy_string
im obigen Beispiel so etwas wie"abcDefg"
(mit einem GroßbuchstabenD
)include?("cde")
wäre , würde zurückkehrenfalse
. Möglicherweise möchten Sie einedowncase()
vor dem Anruf durchführeninclude?()
.to_s
wird das Problem durch Verwendung von ausgeblendet und der Abstand zwischen der Quelle und der Erkennung des Problems vergrößert, wodurch das Debuggen erschwert wird.Wenn der Fall irrelevant ist, ist ein regulärer Ausdruck ohne Berücksichtigung der Groß- und Kleinschreibung eine gute Lösung:
Dies funktioniert auch für mehrzeilige Zeichenfolgen.
Weitere Informationen finden Sie in Rubys Regexp- Klasse.
quelle
Regexp.escape
für die Zeichenfolge zu verwenden. Für die meisten Anwendungsfällesome_str.include? substr.downcase()
sollte schneller arbeiten und besser lesbar sein.'aBcDe'.downcase.include?('bcd')
. Regex haben ihren Zweck, verwenden sie jedoch nicht, wenn die integrierten Methoden schneller sind. Das Benchmarking mit den tatsächlich getesteten Daten kann viel verraten./bcd/i.match?('aBcDe')
Sie können dies auch tun ...
In diesem Beispiel wird die Ruby-String-
#[]
Methode verwendet.quelle
#include?
aber noch etwas schneller.#include?
funktioniert nicht, wenn Sie mit Sätzen mit Leerzeichen arbeiten, da#include
der Satz in Wörter aufgeteilt wird und die Wörter dann als separate Array-Werte verwendet werden. Dies funktioniert perfekt für Sätze. +1[]
Weitere Informationen finden Sie unter Ruby's String- Methode.Erweiterung der Antwort von Clint Pachl:
Die Regex-Übereinstimmung in Ruby wird zurückgegeben,
nil
wenn der Ausdruck nicht übereinstimmt. Wenn dies der Fall ist, wird der Index des Zeichens zurückgegeben, in dem die Übereinstimmung stattfindet. Zum Beispiel:Es ist wichtig zu beachten, dass nur in Ruby
nil
und der boolesche Ausdruckfalse
als falsch ausgewertet werden. Alles andere, einschließlich eines leeren Arrays, eines leeren Hash oder der Ganzzahl 0, wird als wahr ausgewertet.Deshalb
/foo/
funktioniert das obige Beispiel und warum.funktioniert wie erwartet und gibt nur dann den 'wahren' Teil des
if
Blocks ein, wenn eine Übereinstimmung aufgetreten ist.quelle
Eine prägnantere Redewendung als die oben akzeptierte Antwort, die in Rails (ab 3.1.0 und höher) verfügbar ist, lautet
.in?
:Ich denke auch, dass es besser lesbar ist.
in?
Weitere Informationen finden Sie in der Dokumentation.Beachten Sie erneut, dass es nur in Rails und nicht in reinem Ruby verfügbar ist .
quelle
in?
."cde".in? my_string
in reinen RubinausbeutenNoMethodError
. Aberrequire 'active_support/core_ext/object/inclusion'
damit funktioniert es, das entweder von Rails selbst oder von den reduzierten Active Support Core Extensions geladen werden kann .Ternärer Weg
ODER
quelle
Sie können die String Element Reference- Methode verwenden
[]
In der
[]
kann sich entweder ein Literal-Teilstring, ein Index oder ein Regex befinden:Da dies
nil
funktional dasselbe ist wiefalse
und jeder Teilstring, von dem zurückgegeben[]
wirdtrue
, können Sie die Logik so verwenden, als ob Sie die Methode verwenden.include?
:Stellen Sie nur sicher, dass Sie einen Index nicht mit einer Unterzeichenfolge verwechseln:
Sie können auch einen regulären Ausdruck verwenden:
quelle
Wenn Sie 'check' sagen, möchten Sie vermutlich einen Booleschen Wert zurückgeben. In diesem Fall können Sie ihn verwenden
String#match?
.match?
Akzeptiert Zeichenfolgen oder reguläre Ausdrücke als ersten Parameter. Wenn dies der erstere ist, wird er automatisch in einen regulären Ausdruck konvertiert. Ihr Anwendungsfall wäre also:String#match?
hat den zusätzlichen Vorteil eines optionalen zweiten Arguments, das einen Index angibt, von dem aus die Zeichenfolge durchsucht werden soll. Standardmäßig ist dies auf eingestellt0
.quelle
Auf diese Weise können Sie überprüfen, ob die Zeichenfolge Teilzeichenfolgen enthält oder nicht
quelle