package javaregex class RegexPlayground( val sentRegex : RegexProperty, val sentMatchWords : BoolProperty, val sentMatchCase : BoolProperty, val regexForm : RegexForm ) : FormBehaviour( regexForm.title, regexForm ) { constructor( regexForm : RegexForm ) : this( null, null, null, regexForm ) constructor( sentRegex : RegexProperty, sentMatchWords : BoolProperty, sentMatchCase : BoolProperty ) : this ( sentRegex, sentMatchWords, sentMatchCase, RegexForm() ) init { if ( sentRegex != null) regexForm.pattern.value = sentRegex.value if ( sentMatchWords != null) regexForm.matchWords.value = sentMatchWords.value if ( sentMatchCase != null) regexForm.matchCase.value = sentMatchCase.value regexForm.pattern.listen( this:>updated ) regexForm.matchCase.listen( this:>updated ) regexForm.matchWords.listen( this:>updated ) regexForm.text.listen( this:>updated ) regexForm.matchNumber.listen( this:>updated ) updated() otherButtons.add( "Help" ) otherButtons.add( "Java API" ) } override meth onCancel() { closeCurrentBehaviour() } override meth onOther( label : String ) { if (label == "Help" ) { markdownTextBehaviour( "Java Regex", JavaRegex.patternHelp ).apply { iconName = "help" }.dockBehaviour( Side.RIGHT, true ) } else { openLink( "https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#sum" ) } } override meth onOK() { if (sentRegex != null) sentRegex.value = regexForm.pattern.value if (sentMatchCase != null) sentMatchCase.value = regexForm.matchCase.value if (sentMatchWords != null) sentMatchWords.value = regexForm.matchWords.value closeCurrentBehaviour() } meth updated() { try { val quotedPattern = regexForm.pattern.value // Note, the order is important! .replace( "\\", "\\\\" ) // Escape the \ character .replace( "\"", "\\\"" ) // Escape the " character regexForm.javaString.value = "\"${quotedPattern}\"" val pattern = JavaRegexFlavour().pattern( regexForm.pattern.value, true, regexForm.matchCase.value, regexForm.matchWords.value ) val matcher = pattern.matcher( regexForm.text.value ) for ( i in 0 until regexForm.matchNumber.value ) { if (!matcher.find()) { regexForm.group0.value = "" return } } updateGroup( matcher, 0, regexForm.group0 ) updateGroup( matcher, 1, regexForm.group1 ) updateGroup( matcher, 2, regexForm.group2 ) updateGroup( matcher, 3, regexForm.group3 ) } catch ( e : Exception ) { regexForm.group0.value = "ERROR :\n$e" } } meth updateGroup( matcher : Matcher, groupIndex : int, prop : StringProperty ) { try { prop.value = matcher.group( groupIndex ) } catch (e : Exception) { prop.value = "" } } }