Fusionando varias tags <script> en una en Kotlin

Considere la siguiente pieza de código HTML:

<script>...</script> <script>...</script> <div>...</div> <script>...</script> <script>...</script> <script>...</script> <script>...</script> <style>...</style> <script>...</script> <script>...</script> 

Me gustaría fusionar las secciones del script en una de las siguientes maneras:

 <script>...</script> <div>...</div> <script>...</script> <style>...</style> <script>...</script> 

Intenté esta pieza de código:

 while (true) { val newSource = source.replace( "[<]script[>](.*?)[<]/script[>]\\s*[<]script[>]" .toRegex(setOf(RegexOption.MULTILINE, RegexOption.DOT_MATCHES_ALL)), "<script>$1</script>") if (source.equals(newSource)) { break; } source = newSource } 

No es elegante y no funciona 🙂

  1. Me gustaría evitar el ciclo. ¿Puedo escribir una expresión regular para procesar todo el código?
  2. Esto conducirá a solo un solo <script>...</script> ya que consumirá tanto el <div> como <style> en el medio. ¿Cómo puedo prohibir los contenidos que contienen tags?

 fun main(args: Array<String>) { var source=""" <script>...</script> <script>...</script> <div>...</div> <script>...</script> <script>...</script> <script>...</script> <script>...</script> <style>...</style> <script>...</script> <script>...</script> """ source = source.replace( "[<]/script[>]\\s*[<]script[>]" .toRegex(setOf(RegexOption.MULTILINE, RegexOption.DOT_MATCHES_ALL)), "\n") println(source) } 
  • Diseño de expresiones regulares multilínea
  • groupValues ​​solo devuelve la última aparición de patrón repetitivo
  • Regex: un metacarácter para reconocer cualquier tipo de personaje
  • Una expresión regular que reconocería a / * ... * / note