Brace expansion: Difference between revisions
Content added Content deleted
(Added Kotlin) |
|||
Line 1,659: | Line 1,659: | ||
] |
] |
||
}</lang> |
}</lang> |
||
=={{header|Kotlin}}== |
|||
{{trans|Java}} |
|||
<lang scala>// version 1.1.1 |
|||
object BraceExpansion { |
|||
fun expand(s: String) = expandR("", s, "") |
|||
private val r = Regex("""([\\]{2}|[\\][,}{])""") |
|||
private fun expandR(pre: String, s: String, suf: String) { |
|||
val noEscape = s.replace(r, " ") |
|||
var sb = StringBuilder("") |
|||
var i1 = noEscape.indexOf('{') |
|||
var i2 = 0 |
|||
outer@ while (i1 != -1) { |
|||
sb = StringBuilder(s) |
|||
var depth = 1 |
|||
i2 = i1 + 1 |
|||
while (i2 < s.length && depth > 0) { |
|||
val c = noEscape[i2] |
|||
if (c == '{') |
|||
depth++ |
|||
else if (c == '}') |
|||
depth-- |
|||
if (c == ',' && depth == 1) |
|||
sb[i2] = '\u0000' |
|||
else if (c == '}' && depth == 0 && sb.indexOf("\u0000") != -1) |
|||
break@outer |
|||
i2++ |
|||
} |
|||
i1 = noEscape.indexOf('{', i1 + 1) |
|||
} |
|||
if (i1 == -1) { |
|||
if (suf.length > 0) |
|||
expandR(pre + s, suf, "") |
|||
else |
|||
println("$pre$s$suf") |
|||
} |
|||
else { |
|||
for (m in sb.substring(i1 + 1, i2).split('\u0000')) |
|||
expandR(pre + s.substring(0, i1), m, s.substring(i2 + 1) + suf) |
|||
} |
|||
} |
|||
} |
|||
fun main(args: Array<String>) { |
|||
val strings = arrayOf( |
|||
"""~/{Downloads,Pictures}/*.{jpg,gif,png}""", |
|||
"""It{{em,alic}iz,erat}e{d,}, please.""", |
|||
"""{,{,gotta have{ ,\, again\, }}more }cowbell!""", |
|||
"""{}} some }{,{\\{ edge, edge} \,}{ cases, {here} \\\\\}""" |
|||
) |
|||
for (s in strings) { |
|||
println() |
|||
BraceExpansion.expand(s) |
|||
} |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
~/Downloads/*.jpg |
|||
~/Downloads/*.gif |
|||
~/Downloads/*.png |
|||
~/Pictures/*.jpg |
|||
~/Pictures/*.gif |
|||
~/Pictures/*.png |
|||
Itemized, please. |
|||
Itemize, please. |
|||
Italicized, please. |
|||
Italicize, please. |
|||
Iterated, please. |
|||
Iterate, please. |
|||
cowbell! |
|||
more cowbell! |
|||
gotta have more cowbell! |
|||
gotta have\, again\, more cowbell! |
|||
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\} |
|||
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\} |
|||
</pre> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |