I needed to display some sentences in a GUI by splitting some text into natural lines.
However I realised that StringSplit, Loop Parse etc. were omitting the delimiters from the result.
In this case this was a problem.
Couldn't find a script so here is one
Edit : Much simplier 2-liner by Helgef/jeeswg
Code: Select all
teststring:="This is a test??? This is a test2... This is a test3[] This is a test4!!?"
msgbox % "Split by punctuation `n" SplitTextByDelim(teststring)
msgbox % "Split by custom delimiters `n" SplitTextByDelim(teststring,"!?.[]")
; msgbox %
exitapp
return
SplitTextByDelim(P_Text,P_Delim="!?.") {
P_Delim:= RegExReplace(P_Delim, "[\^\-\]\\]", "\$0")
return RTrim(RegExReplace(P_Text, "([" P_Delim "])\s+", "$1`r`n"), "`r`n ")
}
Code: Select all
teststring:="Teststring. This is a test? This is a test2! This is a test3?"
msgbox % SplitTextByDelim(teststring)
exitapp
;SplitTextByDelim(P_Text,Delim="!?.")
;SplitText by delimiters but keeps delimiters in returned string
;*****************************
;by DigiDon; Use/modify as you wish
;P_Text - Text to be split
;Delim - List of 1 char delimiters; Default are end-sentence characters (!?.)
SplitTextByDelim(P_Text,Delim="!?.") {
StartingPos:=1
loop {
FoundPositions:={}
Loop, Parse, Delim
{
FoundPos%A_Index%:=InStr(P_Text, A_LoopField,,StartingPos)
If FoundPos%A_Index%
FoundPositions.Push(FoundPos%A_Index%)
}
if !FoundPositions.MaxIndex()
break
FoundPos:=min(FoundPositions*)
if StartingPos=1
ReturnedText:=Trim(SubStr(P_Text,StartingPos,FoundPos-StartingPos+1))
else
ReturnedText.="`n" Trim(SubStr(P_Text,StartingPos,FoundPos-StartingPos+1))
StartingPos:=FoundPos+1
}
if StartingPos!=1
ReturnedText.="`n"
ReturnedText.= Trim(SubStr(P_Text,StartingPos))
return ReturnedText
}
;by infogulch
;https://autohotkey.com/board/topic/71072-arraymax-arraymin/
min(n, x*) {
if (ObjMaxIndex(x) == 0) && IsObject(n)
x := n, x._NewEnum().next(k,n)
for k,v in x
if (v < n)
n := v
return n
}