Option 1
/\b/
ist ein word boundary und hat Null-Breite, so dass es keine Zeichen verbrauchen
'abc+def'.split(/\b/)
# => ["abc", "+", "def"]
'abc*def+eee'.split(/\b/)
# => ["abc", "*", "def", "+", "eee"]
'ab/cd*de+df'.split(/\b/)
# => ["ab", "/", "cd", "*", "de", "+", "df"]
Option 2
Wenn Ihr string enthält andere Wortbegrenzungszeichen und Sie möchten nur t o Teilen auf -
, +
, *
und /
, dann können Sie capture groups verwenden. Wenn eine Erfassungsgruppe verwendet wird, enthält String#split
auch erfasste Zeichenketten im Ergebnis. (Danke für den Hinweis @Jordan) (@Cary Swoveland leid, ich habe nicht gesehen, Ihre Antwort, wenn ich diese bearbeitet)
'abc+def'.split /([+*\/-])/
# => ["abc", "+", "def"]
'abc*def+eee'.split /([+*\/-])/
# => ["abc", "*", "def", "+", "eee"]
'ab/cd*de+df'.split /([+*\/-])/
# => ["ab", "/", "cd", "*", "de", "+", "df"]
Option 3
Schließlich, für diejenigen mit einer Sprache, Die Unterstützung für das Teilen von Strings mit einer Erfassungsgruppe kann nicht unterstützt werden. Sie können zwei lookarounds verwenden. Lookarounds sind auch Null-Breite Streichhölzer, so dass sie keine Zeichen verbrauchen
'abc+def'.split /(?=[+*\/-])|(?<=[+*\/-])/
# => ["abc", "+", "def"]
'abc*def+eee'.split /(?=[+*\/-])|(?<=[+*\/-])/
# => ["abc", "*", "def", "+", "eee"]
'ab/cd*de+df'.split /(?=[+*\/-])|(?<=[+*\/-])/
# => ["ab", "/", "cd", "*", "de", "+", "df"]
Die Idee hier ist auf jeden Charakter zu teilen, die von einem Ihrer Separatoren, oder ein beliebiges Zeichen vorangestellt ist, die von einer der gefolgt wird Trennzeichen. Lassen Sie uns visuelle
ab ⍿/⍿ cd ⍿ * ⍿ de ⍿ + ⍿ df
Die kleinen ⍿
Symbole ein wenig tun, entweder vorangehen oder von einem der Separatoren gefolgt. Hier wird die Saite geschnitten.
Option 4
Vielleicht Ihre Sprache nicht über eine Zeichenfolge split
Funktion oder sinnvolle Möglichkeiten, um mit regulären Ausdrücken zu interagieren. Es ist schön zu wissen, dass man nicht herumsitzen muss, um zu raten, ob es clevere eingebaute Verfahren gibt, die auf magische Weise deine Probleme lösen.Es gibt fast immer einen Weg, Ihr Problem mit einfachen Anweisungen zu lösen
class String
def head
self[0]
end
def tail
self[1..-1]
end
def reduce acc, &f
if empty?
acc
else
tail.reduce yield(acc, head), &f
end
end
def separate chars
res, acc = reduce [[], ''] do |(res, acc), char|
if chars.include? char
[res + [acc, char], '']
else
[res, acc + char]
end
end
res + [acc]
end
end
'abc+def'.separate %w(- +/*)
# => ["abc", "+", "def"]
'abc*def+eee'.separate %w(- +/*)
# => ["abc", "*", "def", "+", "eee"]
'ab/cd*de+df'.separate %w(- +/*)
# => ["ab", "/", "cd", "*", "de", "+", "df"]
Hinweis: '.split' akzeptiert reguläre Ausdrücke –
Willkommen bei Stack Overflow. Bitte lesen Sie "[fragen]" und die verlinkten Seiten. Wir müssen Beweise für Ihre Bemühungen zur Lösung des Problems sehen. Hast du Code geschrieben? Wenn nein, warum nicht? Wo haben Sie nach einer Lösung gesucht? Wenn du nicht gesucht hast, warum? Momentan scheint Ihre Frage ein Plädoyer für uns zu sein, den Code für Sie zu schreiben, für den SO nicht zuständig ist. –
@theTinMan Sorry, darüber. Das werde ich bei künftigen Fragen berücksichtigen. – Lokesh