Text between: Difference between revisions

122,507 bytes added ,  18 days ago
Added Easylang
(→‎{{header|Haskell}}: Updated for new spec and examples)
(Added Easylang)
 
(89 intermediate revisions by 43 users not shown)
Line 1:
{{draft task|Text between}}
[[Category:Strings]]
 
;Task:
Get the text betweenin a startstring andthat endoccurs delimiter,between which are not blank, and can be thea start and end of the stringdelimiter.
Programs will be given a search string, a start delimiter string, and an end delimiter string. The delimiters will not be unset, and will not be the empty string.
 
The value returned should be the text in the search string that occurs between the '''first''' occurrence of the start delimiter (starting after the text of the start delimiter) and the '''first''' occurrence of the end delimiter after that.
 
If the start delimiter is not present in the search string, a blank string should be returned.
Example 1. Both delimiters set
 
If the end delimiter is not present after the end of the first occurrence of the start delimiter in the search string, the remainder of the search string after that point should be returned.
<pre>
Text: "Hello Rosetta Code world"
 
There are two special values for the delimiters. If the value of the start delimiter is "start", the beginning of the search string will be matched. If the value of the end delimiter is "end", the end of the search string will be matched.
Start delimiter: "Hello "
 
Example 1. Both delimiters set
End delimiter: " world"
<pre>
 
Output Text: "Hello Rosetta Code world"
Start delimiter: "Hello "
End delimiter: " world"
Output: "Rosetta Code"
</pre>
 
Example 2. Start delimiter is the start of the string
<pre>
Text: "Hello Rosetta Code world"
Start delimiter: "start"
End delimiter: " world"
Output: "Hello Rosetta Code"
</pre>
 
Example 3. End delimiter is the end of the string
<pre>
Text: "Hello Rosetta Code world"
Start delimiter: "Hello"
End delimiter: "end"
Output: "Rosetta Code world"
</pre>
 
StartExample 4. End delimiter: "appears before and after start" delimiter
<pre>
Text: "</div><div style=\"chinese\">你好嗎</div>"
Start delimiter: "<div style=\"chinese\">"
End delimiter: "</div>"
Output: "你好嗎"
</pre>
 
Example 5. End delimiter: "not world"present
<pre>
Text: "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
Start delimiter: "<text>"
End delimiter: "<table>"
Output: "Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
</pre>
 
Example 6. Start delimiter not present
Output: "Hello Rosetta Code"
<pre>
Text: "<table style=\"myTable\"><tr><td>hello world</td></tr></table>"
Start delimiter: "<table>"
End delimiter: "</table>"
Output: ""
</pre>
 
Example 7. Multiple instances of end delimiter after start delimiter (match until the first one)
<pre>
Text: "The quick brown fox jumps over the lazy other fox"
Start delimiter: "quick "
End delimiter: " fox"
Output: "brown"
</pre>
 
Example 38. EndMultiple delimiterinstances isof the endstart ofdelimiter (start matching at the stringfirst one)
<pre>
Text: "One fish two fish red fish blue fish"
Start delimiter: "fish "
End delimiter: " red"
Output: "two fish"
</pre>
 
Example 9. Start delimiter is end delimiter
<pre>
Text: "FooBarBazFooBuxQuux"
Text: "Hello Rosetta Code world"
Start delimiter: "Foo"
End delimiter: "Foo"
Output: "BarBaz"
</pre>
 
{{Template:Strings}}
Start delimiter: "Hello"
<br><br>
 
=={{header|11l}}==
End delimiter: "end"
{{trans|Python}}
 
<syntaxhighlight lang="11l">F textBetween(thisText, startString, endString)
Output: "Rosetta Code world"
X.try
</pre>
Int startIndex
I startString == ‘start’
startIndex = 0
E
startIndex = thisText.index(startString)
 
I !(startIndex >= 0)
R ‘Start delimiter not found’
E
I startString != ‘start’
startIndex = startIndex + startString.len
 
V returnText = thisText[startIndex ..]
The end delimiter selected should be the next instance after the start delimiter.
 
I endString == ‘end’
Example 4. End delimiter appears before and after start delimiter
R returnText
E
V endIndex = returnText.index(endString)
 
I !(endIndex >= 0)
R ‘End delimiter not found’
E
returnText = returnText[0 .< endIndex]
 
R returnText
 
X.catch ValueError
R ‘Value error’
 
:start:
V thisText = :argv[1]
V startString = :argv[2]
V endString = :argv[3]
print(textBetween(thisText, startString, endString))</syntaxhighlight>
 
=={{header|Action!}}==
<syntaxhighlight lang="action!">BYTE FUNC Matches(CHAR ARRAY text,sub BYTE index)
CHAR ARRAY tmp(255)
 
SCopyS(tmp,text,index,index+sub(0)-1)
IF SCompare(tmp,sub)=0 THEN
RETURN (1)
FI
RETURN (0)
 
BYTE FUNC FindFrom(CHAR ARRAY text,delim BYTE start)
BYTE i,end
 
IF text(0)<delim(0) OR delim(0)=0 THEN
RETURN (0)
FI
end=text(0)-delim(0)+1
FOR i=start TO end
DO
IF Matches(text,delim,i) THEN
RETURN (i)
FI
OD
RETURN (0)
 
PROC TextBetween(CHAR ARRAY text,start,end,res)
BYTE first,last
 
IF SCompare(start,"start")=0 THEN
first=1
ELSE
first=FindFrom(text,start,1)
IF first=0 THEN
res(0)=0
RETURN
ELSE
first==+start(0)
FI
FI
 
IF SCompare(end,"end")=0 THEN
last=text(0)
ELSE
last=FindFrom(text,end,first+1)
IF last<=first THEN
last=text(0)
ELSE
last==-1
FI
FI
 
SCopyS(res,text,first,last)
RETURN
 
PROC Test(BYTE n CHAR ARRAY text,start,end)
CHAR ARRAY res(255)
 
TextBetween(text,start,end,res)
PrintF("Ex%B. ""%S""%E%E",n,res)
RETURN
 
PROC Main()
Test(1,"Hello Rosetta Code world","Hello "," world")
Test(2,"Hello Rosetta Code world","start"," world")
Test(3,"Hello Rosetta Code world","Hello ","end")
Test(4,"</div><div style=\""chinese\"">???</div>","<div style=\""chinese\"">","</div>")
Test(5,"<text>Hello <span>Rosetta Code</span> world</text><table style=\""myTable\"">","<text>","<table>")
Test(6,"<table style=\""myTable\""><tr><td>hello world</td></tr></table>","<table>","</table>")
Test(7,"The quick brown fox jumps over the lazy other fox","quick "," fox")
Test(8,"One fish two fish red fish blue fish","fish "," red")
Test(9,"FooBarBazFooBuxQuux","Foo","Foo")
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Text_between.png Screenshot from Atari 8-bit computer]
<pre>
Ex1. "Rosetta Code"
Text: "</div><div style=\"chinese\">你好嗎</div>"
 
Ex2. "Hello Rosetta Code"
Start delimiter: "<div style=\"chinese\">"
 
Ex3. "Rosetta Code world"
End delimiter: "</div>"
 
Ex4. "???"
Output: "你好嗎"
 
Ex5. "Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
 
Ex6. ""
 
Ex7. "brown"
 
Ex8. "two fish"
 
Ex9. "BarBaz"
</pre>
 
=={{header|Ada}}==
<syntaxhighlight lang="ada">with Ada.Text_Io;
with Ada.Strings.Fixed;
 
procedure Text_Between is
If the end delimiter is not present, default to "end".
 
Default_Start : constant String := "start";
Example 5. End delimiter not present
Default_End : constant String := "end";
 
function Between (Item : String;
First : String := Default_Start;
Last : String := Default_End) return String
is
use Ada.Strings.Fixed;
First_Pos : Natural;
Last_Pos : Natural;
begin
if First = Default_Start then
First_Pos := Item'First;
else
First_Pos := Index (Item, First);
if First_Pos = 0 then
return "";
else
First_Pos := First_Pos + First'Length;
end if;
end if;
 
if Last = Default_End then
return Item (First_Pos .. Item'Last);
else
Last_Pos := Index (Item (First_Pos .. Item'Last), Last);
if Last_Pos = 0 then
return Item (First_Pos .. Item'Last);
else
return Item (First_Pos .. Last_Pos - 1);
end if;
end if;
end Between;
 
procedure Test_Between (Text, First, Last : String) is
use Ada.Text_Io;
function Quote (Item : String) return String is ("'" & Item & "'");
Result : String renames Between (Text, First, Last);
begin
Put ("Text: "); Put_Line (Quote (Text));
Put ("Start: "); Put_Line (Quote (First));
Put ("End: "); Put_Line (Quote (Last));
Put ("Result: "); Put_Line (Quote (Result));
New_Line;
end Test_Between;
 
begin
Test_Between ("Hello Rosetta Code world", First => "Hello ", Last => " world");
Test_Between ("Hello Rosetta Code world", First => Default_Start, Last => " world");
Test_Between ("Hello Rosetta Code world", First => "Hello ", Last => Default_End);
Test_Between ("</div><div style=\""chinese\"">你好嗎</div>",
First => "<div style=\""chinese\"">", Last => "</div>");
Test_Between ("<text>Hello <span>Rosetta Code</span> world</text><table style=\""myTable\"">",
First => "<text>", Last => "<table>");
Test_Between ("<table style=\""myTable\""><tr><td>hello world</td></tr></table>",
First => "<table>", Last => "</table>");
Test_Between ("The quick brown fox jumps over the lazy other fox",
First => "quick ", Last => " fox");
Test_Between ("One fish two fish red fish blue fish", First => "fish ", Last => " red");
Test_Between ("FooBarBazFooBuxQuux", First => "Foo", Last => "Foo");
end Text_Between;</syntaxhighlight>
{{out}}
<pre>
Text: "<text> 'Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"'
Start: 'Hello '
End: ' world'
Result: 'Rosetta Code'
 
Text: 'Hello Rosetta Code world'
Start delimiter: "<text>"
Start: 'start'
End: ' world'
Result: 'Hello Rosetta Code'
 
Text: 'Hello Rosetta Code world'
End delimiter: "<table>"
Start: 'Hello '
End: 'end'
Result: 'Rosetta Code world'
 
OutputText: "Hello <span>Rosetta Code'</span> world</textdiv><tablediv style=\"myTablechinese\">"你好嗎</div>'
Start: '<div style=\"chinese\">'
End: '</div>'
Result: '你好嗎'
 
Text: '<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">'
Start: '<text>'
End: '<table>'
Result: 'Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">'
 
Text: '<table style=\"myTable\"><tr><td>hello world</td></tr></table>'
Start: '<table>'
End: '</table>'
Result: ''
 
Text: 'The quick brown fox jumps over the lazy other fox'
Start: 'quick '
End: ' fox'
Result: 'brown'
 
Text: 'One fish two fish red fish blue fish'
Start: 'fish '
End: ' red'
Result: 'two fish'
 
Text: 'FooBarBazFooBuxQuux'
Start: 'Foo'
End: 'Foo'
Result: 'BarBaz'
</pre>
 
=={{header|ALGOL 68}}==
{{works with|ALGOL 68G|Any - tested with release 2.8.3.win32}}<br/>
Uses the Algol 68G specific string in string, for other compilers/interpreters, a version of string in string is here : [[ALGOL_68/prelude]].<br/>
As Algol 68 predates Unicode, the fourth example deviates from the task.
<syntaxhighlight lang="algol68">BEGIN
# some utility operators #
# returns the length of a string #
OP LENGTH = ( STRING a )INT: ( UPB a - LWB a ) + 1;
# returns the position of s in t or UPB t + 1 if s is not present #
PRIO INDEXOF = 1;
OP INDEXOF = ( STRING t, STRING s )INT:
IF INT pos; string in string( s, pos, t ) THEN pos ELSE UPB t + 1 FI;
# returns the text after s in t or "" if s is not present #
PRIO AFTER = 1;
OP AFTER = ( STRING t, STRING s )STRING:
IF INT pos = t INDEXOF s; pos > UPB t THEN "" ELSE t[ pos + LENGTH s : ] FI;
# returns the text before s in t or t if s is not present #
PRIO BEFORE = 1;
OP BEFORE = ( STRING t, STRING s )STRING:
IF INT pos = t INDEXOF s; pos > UPB t THEN t ELSE t[ : pos - 1 ] FI;
 
# mode to hold a pair of STRINGs for the BETWEEN operator #
If the start delimiter is not present, return a blank string.
MODE STRINGPAIR = STRUCT( STRING left, right );
# returns a STRINGPAIR composed of a and b (standard priority for AND) #
# with additional operators for CHARs as "a" is a CHAR denotation, #
# not a STRING of length 1 #
OP AND = ( STRING a, STRING b )STRINGPAIR: ( a, b );
OP AND = ( STRING a, CHAR b )STRINGPAIR: ( STRING(a), b );
OP AND = ( CHAR a, CHAR b )STRINGPAIR: ( STRING(a), STRING(b) );
OP AND = ( CHAR a, STRING b )STRINGPAIR: ( a , STRING(b) );
 
# traceing flag for BETWEEN - if TRUE, debug output is shown #
Example 6. Start delimiter not present
BOOL trace between := FALSE;
# returns the text of s between the delimitors specified in d #
PRIO BETWEEN = 1;
OP BETWEEN = ( STRING s, STRINGPAIR d )STRING:
BEGIN
STRING result := s;
IF left OF d /= "start" THEN result := result AFTER left OF d FI;
IF right OF d /= "end" THEN result := result BEFORE right OF d FI;
IF trace between THEN
# show debug output #
print( ( "Text: """, s, """", newline
, "Start delimiter: """, left OF d, """", newline
, "End delimiter: """, right OF d, """", newline
, "Output: """, result, """", newline
, newline
)
)
FI;
result
END # BETWEEN # ;
 
# test cases #
BEGIN
STRING s;
trace between := TRUE;
s := "Hello Rosetta Code world" BETWEEN "Hello " AND " world";
s := "Hello Rosetta Code world" BETWEEN "start" AND " world";
s := "Hello Rosetta Code world" BETWEEN "Hello " AND "end";
s := "</div><div style=""french"">bonjour</div>"
BETWEEN "<div style=""french"">"
AND "</div>";
s := "<text>Hello <span>Rosetta Code</span> world</text><table style=""myTable"">"
BETWEEN "<text>" AND "<table>";
s := "<table style=""myTable""><tr><td>hello world</td></tr></table>"
BETWEEN "<table>" AND "</table>";
s := "The quick brown fox jumps over the lazy other fox"
BETWEEN "quick " AND " fox";
s := "One fish two fish red fish blue fish"
BETWEEN "fish " AND " red";
s := "FooBarBazFooBuxQuux" BETWEEN "Foo" AND "Foo";
trace between := FALSE
END
END</syntaxhighlight>
{{out}}
<pre>
Text: "<tableHello style=\"myTable\"><tr><td>helloRosetta Code world</td></tr></table>"
Start delimiter: "Hello "
End delimiter: " world"
Output: "Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start delimiter: "<table>"
Start delimiter: "start"
End delimiter: " world"
Output: "Hello Rosetta Code"
 
Text: "Hello Rosetta Code world"
End delimiter: "</table>"
Start delimiter: "Hello "
End delimiter: "end"
Output: "Rosetta Code world"
 
Text: "</div><div style="french">bonjour</div>"
Start delimiter: "<div style="french">"
End delimiter: "</div>"
Output: "bonjour"
 
Text: "<text>Hello <span>Rosetta Code</span> world</text><table style="myTable">"
Start delimiter: "<text>"
End delimiter: "<table>"
Output: "Hello <span>Rosetta Code</span> world</text><table style="myTable">"
 
Text: "<table style="myTable"><tr><td>hello world</td></tr></table>"
Start delimiter: "<table>"
End delimiter: "</table>"
Output: ""
 
Text: "The quick brown fox jumps over the lazy other fox"
</pre>
Start delimiter: "quick "
End delimiter: " fox"
Output: "brown"
 
Text: "One fish two fish red fish blue fish"
Start delimiter: "fish "
End delimiter: " red"
Output: "two fish"
 
Text: "FooBarBazFooBuxQuux"
<br><br>
Start delimiter: "Foo"
End delimiter: "Foo"
Output: "BarBaz"
 
</pre>
 
=={{header|AppleScript}}==
<langsyntaxhighlight lang="applescript">
my text_between("Hello Rosetta Code world", "Hello ", " world")
 
Line 116 ⟶ 485:
return return_text
end text_between
</syntaxhighlight>
</lang>
 
=={{header|AutoHotkey}}==
<syntaxhighlight lang="autohotkey">data =
(
Hello Rosetta Code world|Hello | world|
Hello Rosetta Code world|start| world|
Hello Rosetta Code world|Hello |end|
</div><div style=\"chinese\">你好嗎</div>|<div style=\"chinese\">|</div>|
<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">|<text>|<table>|
<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">|<table>|</table>|
The quick brown fox jumps over the lazy other fox|quick | fox|
One fish two fish red fish blue fish|fish | red|
FooBarBazFooBuxQuux|Foo|Foo|
)
result := ""
for i, line in StrSplit(data, "`n", "`r")
x := StrSplit(line, "|")
, result .= "text: """ x.1 """`nstart: """ x.2 """`tend: """ x.3 """`noutput: """ textBetween(x.1, x.2, x.3) """`n----`n"
MsgBox, 262144, , % result
return
 
textBetween(text, start, end){
RegExMatch(text,(start="start"?"^":"\Q" start "\E") "(.*?)" (end="end"?"$":"\Q" end "\E?"),m)
return m1
}</syntaxhighlight>
{{out}}
<pre>text: "Hello Rosetta Code world"
start: "Hello " end: " world"
output: "Rosetta Code"
----
text: "Hello Rosetta Code world"
start: "start" end: " world"
output: "Hello Rosetta Code"
----
text: "Hello Rosetta Code world"
start: "Hello " end: "end"
output: "Rosetta Code world"
----
text: "</div><div style=\"chinese\">你好嗎</div>"
start: "<div style=\"chinese\">" end: "</div>"
output: "你好嗎"
----
text: "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
start: "<text>" end: "<table>"
output: "Hello <span>Rosetta Code</span> world</text>"
----
text: "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
start: "<table>" end: "</table>"
output: ""
----
text: "The quick brown fox jumps over the lazy other fox"
start: "quick " end: " fox"
output: "brown"
----
text: "One fish two fish red fish blue fish"
start: "fish " end: " red"
output: "two fish"
----
text: "FooBarBazFooBuxQuux"
start: "Foo" end: "Foo"
output: "BarBaz"
----</pre>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
# syntax: GAWK -f TEXT_BETWEEN.AWK
BEGIN {
main("Hello Rosetta Code world","Hello "," world","1. Both delimiters set")
main("Hello Rosetta Code world","start"," world","2. Start delimiter is the start of the string")
main("Hello Rosetta Code world","Hello","end","3. End delimiter is the end of the string")
main("</div><div style=\"chinese\">???</div>","<div style=\"chinese\">","</div>",
"4. End delimiter appears before and after start delimiter")
main("<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">","<text>","<table>",
"5. End delimiter not present")
main("<table style=\"myTable\"><tr><td>hello world</td></tr></table>","<table>","</table>",
"6. Start delimiter not present")
main("The quick brown fox jumps over the lazy other fox","quick "," fox",
"7. Multiple instances of end delimiter after start delimiter (match until the first one)")
main("One fish two fish red fish blue fish","fish "," red",
"8. Multiple instances of the start delimiter (start matching at the first one)")
main("FooBarBazFooBuxQuux","Foo","Foo","9. Start delimiter is end delimiter")
main("Hello Rosetta Code world","start","end","10. Start and end delimiters use special values")
main("Hello Rosetta Code world","","x","11. Null start delimiter")
main("Hello Rosetta Code world","x","","12. Null end delimiter")
exit(0)
}
function main(text,sdelim,edelim,example, pos,str) {
printf("Example %s\n",example)
printf("Text: '%s'\n",text)
printf("sDelim: '%s'\n",sdelim)
printf("eDelim: '%s'\n",edelim)
if (sdelim == "" || edelim == "") {
printf("error: null delimiter\n\n")
return
}
if (sdelim == "start") {
str = text
}
else {
pos = index(text,sdelim)
if (pos > 0) {
str = substr(text,pos+length(sdelim))
}
}
if (edelim == "end") {
}
else {
pos = index(str,edelim)
if (pos > 0) {
str = substr(str,1,pos-1)
}
}
printf("Output: '%s'\n\n",str)
}
</syntaxhighlight>
{{out}}
<pre>
Example 1. Both delimiters set
Text: 'Hello Rosetta Code world'
sDelim: 'Hello '
eDelim: ' world'
Output: 'Rosetta Code'
 
Example 2. Start delimiter is the start of the string
Text: 'Hello Rosetta Code world'
sDelim: 'start'
eDelim: ' world'
Output: 'Hello Rosetta Code'
 
Example 3. End delimiter is the end of the string
Text: 'Hello Rosetta Code world'
sDelim: 'Hello'
eDelim: 'end'
Output: ' Rosetta Code world'
 
Example 4. End delimiter appears before and after start delimiter
Text: '</div><div style="chinese">???</div>'
sDelim: '<div style="chinese">'
eDelim: '</div>'
Output: '???'
 
Example 5. End delimiter not present
Text: '<text>Hello <span>Rosetta Code</span> world</text><table style="myTable">'
sDelim: '<text>'
eDelim: '<table>'
Output: 'Hello <span>Rosetta Code</span> world</text><table style="myTable">'
 
Example 6. Start delimiter not present
Text: '<table style="myTable"><tr><td>hello world</td></tr></table>'
sDelim: '<table>'
eDelim: '</table>'
Output: ''
 
Example 7. Multiple instances of end delimiter after start delimiter (match until the first one)
Text: 'The quick brown fox jumps over the lazy other fox'
sDelim: 'quick '
eDelim: ' fox'
Output: 'brown'
 
Example 8. Multiple instances of the start delimiter (start matching at the first one)
Text: 'One fish two fish red fish blue fish'
sDelim: 'fish '
eDelim: ' red'
Output: 'two fish'
 
Example 9. Start delimiter is end delimiter
Text: 'FooBarBazFooBuxQuux'
sDelim: 'Foo'
eDelim: 'Foo'
Output: 'BarBaz'
 
Example 10. Start and end delimiters use special values
Text: 'Hello Rosetta Code world'
sDelim: 'start'
eDelim: 'end'
Output: 'Hello Rosetta Code world'
 
Example 11. Null start delimiter
Text: 'Hello Rosetta Code world'
sDelim: ''
eDelim: 'x'
error: null delimiter
 
Example 12. Null end delimiter
Text: 'Hello Rosetta Code world'
sDelim: 'x'
eDelim: ''
error: null delimiter
</pre>
 
=={{header|C}}==
<syntaxhighlight lang="c">
<lang c>
/*
* textBetween: Gets text between two delimiters
Line 178 ⟶ 736:
return startPointer;
} // end textBetween method</langsyntaxhighlight>
 
=={{header|HaskellC sharp|C#}}==
{{trans|D}}
<lang Haskell>import Data.Text
<syntaxhighlight lang="csharp">using System;
(Text, breakOn, length, pack, stripPrefix, unpack)
import Data.List (intercalate)
import Control.Arrow ((***))
 
namespace TextBetween {
-- TEXT BETWEEN -----------------------------------------------------------
class Program {
static string TextBetween(string source, string beg, string end) {
int startIndex;
 
if (beg == "start") {
textBetween :: (Either Text Text, Either Text Text) -> Text -> Text
startIndex = 0;
textBetween (s, e) txt =
let stet t = (Just . const t) }
prune f t = f . flipelse breakOn t{
startIndex = source.IndexOf(beg);
mb =
either (stet txt) (stripPrefix <*> prune snd txt) sif (startIndex < 0) >>={
(\lp -> either (stet lp) (Just . prune fst lp) e) return "";
}
in case mb of
Just x -> x startIndex += beg.Length;
_ -> pack [] }
 
int endIndex = source.IndexOf(end, startIndex);
-- TESTS ------------------------------------------------------------------
if (endIndex < 0 || end == "end") {
samples :: [Text]
return source.Substring(startIndex);
samples =
}
pack <$>
return source.Substring(startIndex, endIndex - startIndex);
[ "Hello Rosetta Code world"
}
, "</div><div style=\"chinese\">你好吗</div>"
, "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
, "<table style=\"myTable\"><tr><td>hello world</td></tr></table>"
]
 
static void Print(string s, string b, string e) {
delims :: [(Either Text Text, Either Text Text)]
Console.WriteLine("text: '{0}'", s);
delims =
Console.WriteLine("start: '{0}'", b);
(wrap *** wrap) <$>
Console.WriteLine("end: '{0}'", e);
[ ("Hello ", " world")
Console.WriteLine("result: '{0}'", TextBetween(s, b, e));
, ("start", " world")
Console.WriteLine();
, ("Hello", "end")
}
, ("<div style=\"chinese\">", "</div>")
, ("<text>", "<table>")
, ("<text>", "</table>")
]
 
static void Main(string[] args) {
wrap :: String -> Either Text Text
Print("Hello Rosetta Code world", "Hello ", " world");
wrap x =
if x `elem` [ Print("Hello Rosetta Code world", "start", "end world"]);
Print("Hello Rosetta Code world", "Hello ", "end");
then Left (pack x)
Print("</div><div style=\"chinese\">你好嗎</div>", "<div style=\"chinese\">", "</div>");
else Right (pack x)
Print("<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">", "<text>", "<table>");
Print("<table style=\"myTable\"><tr><td>hello world</td></tr></table>", "<table>", "</table>");
Print("The quick brown fox jumps over the lazy other fox", "quick ", " fox");
Print("One fish two fish red fish blue fish", "fish ", " red");
Print("FooBarBazFooBuxQuux", "Foo", "Foo");
}
}
}</syntaxhighlight>
 
=={{header|C++}}==
{{trans|C#}}
<syntaxhighlight lang="cpp">#include <iostream>
 
std::ostream& operator<<(std::ostream& out, const std::string& str) {
return out << str.c_str();
}
 
std::string textBetween(const std::string& source, const std::string& beg, const std::string& end) {
size_t startIndex;
if (beg == "start") {
startIndex = 0;
} else {
startIndex = source.find(beg);
if (startIndex == std::string::npos) {
return "";
}
startIndex += beg.length();
}
 
size_t endIndex = source.find(end, startIndex);
if (endIndex == std::string::npos || end == "end") {
return source.substr(startIndex);
}
 
return source.substr(startIndex, endIndex - startIndex);
}
 
void print(const std::string& source, const std::string& beg, const std::string& end) {
using namespace std;
cout << "text: '" << source << "'\n";
cout << "start: '" << beg << "'\n";
cout << "end: '" << end << "'\n";
cout << "result: '" << textBetween(source, beg, end) << "'\n";
cout << '\n';
}
 
int main() {
print("Hello Rosetta Code world", "Hello ", " world");
print("Hello Rosetta Code world", "start", " world");
print("Hello Rosetta Code world", "Hello ", "end");
print("<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">", "<text>", "<table>");
print("<table style=\"myTable\"><tr><td>hello world</td></tr></table>", "<table>", "</table>");
print("The quick brown fox jumps over the lazy other fox", "quick ", " fox");
print("One fish two fish red fish blue fish", "fish ", " red");
print("FooBarBazFooBuxQuux", "Foo", "Foo");
 
return 0;
}</syntaxhighlight>
{{out}}
<pre>text: 'Hello Rosetta Code world'
start: 'Hello '
end: ' world'
result: 'Rosetta Code'
 
text: 'Hello Rosetta Code world'
start: 'start'
end: ' world'
result: 'Hello Rosetta Code'
 
text: 'Hello Rosetta Code world'
start: 'Hello '
end: 'end'
result: 'Rosetta Code world'
 
text: '<text>Hello <span>Rosetta Code</span> world</text><table style="myTable">'
start: '<text>'
end: '<table>'
result: 'Hello <span>Rosetta Code</span> world</text><table style="myTable">'
 
text: '<table style="myTable"><tr><td>hello world</td></tr></table>'
start: '<table>'
end: '</table>'
result: ''
 
text: 'The quick brown fox jumps over the lazy other fox'
start: 'quick '
end: ' fox'
result: 'brown'
 
text: 'One fish two fish red fish blue fish'
start: 'fish '
end: ' red'
result: 'two fish'
 
text: 'FooBarBazFooBuxQuux'
start: 'Foo'
end: 'Foo'
result: 'BarBaz'</pre>
 
=={{header|D}}==
<syntaxhighlight lang="d">import std.algorithm.searching;
import std.stdio;
import std.string;
 
string textBetween(string source, string beg, string end) in {
assert(beg.length != 0, "beg cannot be empty");
assert(end.length != 0, "end cannot be empty");
} body {
ptrdiff_t si = source.indexOf(beg);
if (beg == "start") {
si = 0;
} else if (si < 0) {
return "";
} else {
si += beg.length;
}
 
auto ei = source.indexOf(end, si);
if (ei < 0 || end == "end") {
return source[si..$];
}
 
return source[si..ei];
}
 
void print(string s, string b, string e) {
writeln("text: '", s, "'");
writeln("start: '", b, "'");
writeln("end: '", e, "'");
writeln("result: '", s.textBetween(b, e), "'");
writeln;
}
 
void main() {
print("Hello Rosetta Code world", "Hello ", " world");
print("Hello Rosetta Code world", "start", " world");
print("Hello Rosetta Code world", "Hello ", "end");
print("</div><div style=\"chinese\">你好嗎</div>", "<div style=\"chinese\">", "</div>");
print("<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">", "<text>", "<table>");
print("<table style=\"myTable\"><tr><td>hello world</td></tr></table>", "<table>", "</table>");
print("The quick brown fox jumps over the lazy other fox", "quick ", " fox");
print("One fish two fish red fish blue fish", "fish ", " red");
print("FooBarBazFooBuxQuux", "Foo", "Foo");
}</syntaxhighlight>
{{out}}
<pre>text: 'Hello Rosetta Code world'
start: 'Hello '
end: ' world'
result: 'Rosetta Code'
 
text: 'Hello Rosetta Code world'
start: 'start'
end: ' world'
result: 'Hello Rosetta Code'
 
text: 'Hello Rosetta Code world'
start: 'Hello '
end: 'end'
result: 'Rosetta Code world'
 
text: '</div><div style="chinese">你好嗎</div>'
start: '<div style="chinese">'
end: '</div>'
result: '你好嗎'
 
text: '<text>Hello <span>Rosetta Code</span> world</text><table style="myTable">'
start: '<text>'
end: '<table>'
result: 'Hello <span>Rosetta Code</span> world</text><table style="myTable">'
 
text: '<table style="myTable"><tr><td>hello world</td></tr></table>'
start: '<table>'
end: '</table>'
result: ''
 
text: 'The quick brown fox jumps over the lazy other fox'
start: 'quick '
end: ' fox'
result: 'brown'
 
text: 'One fish two fish red fish blue fish'
start: 'fish '
end: ' red'
result: 'two fish'
 
text: 'FooBarBazFooBuxQuux'
start: 'Foo'
end: 'Foo'
result: 'BarBaz'</pre>
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
{{Trans|C#}}
<syntaxhighlight lang="delphi">
program Text_between;
 
{$APPTYPE CONSOLE}
 
uses
System.SysUtils;
 
function TextBetween(source, bg, ed: string): string;
var
startIndex, edIndex: Integer;
begin
if bg = 'start' then
startIndex := 0
else
begin
startIndex := source.IndexOf(bg);
if startIndex < 0 then
Exit('');
 
startIndex := startIndex + bg.Length;
end;
edIndex := source.IndexOf(ed, startIndex);
 
if (edIndex < 0) or (ed = 'end') then
Exit(source.Substring(startIndex));
Exit(source.Substring(startIndex, edIndex - startIndex));
end;
 
procedure Print(s, b, e: string; var ExempleIndex: Integer);
begin
Writeln('Exemple ', ExempleIndex, ':');
Writeln(Format('Text: "%s"', [s]));
Writeln(Format('Start: "%s"', [b]));
Writeln(Format('End: "%s"', [e]));
Writeln(Format('Result: "%s"'#10, [TextBetween(s, b, e)]));
inc(ExempleIndex);
end;
 
var
ExempleIndex: Integer = 1;
 
begin
Print('Hello Rosetta Code world', 'Hello ', ' world', ExempleIndex);
 
Print('Hello Rosetta Code world', 'start', ' world', ExempleIndex);
 
Print('Hello Rosetta Code world', 'Hello ', 'end', ExempleIndex);
 
Print('</div><div style=\"chinese\">你好嗎</div>', '<div style=\"chinese\">',
'</div>', ExempleIndex);
 
Print('<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">',
'<text>', '<table>', ExempleIndex);
 
Print('<table style=\"myTable\"><tr><td>hello world</td></tr></table>',
'<table>', '</table>', ExempleIndex);
 
Print('The quick brown fox jumps over the lazy other fox', 'quick ', ' fox',
ExempleIndex);
 
Print('One fish two fish red fish blue fish', 'fish ', ' red', ExempleIndex);
 
Print('FooBarBazFooBuxQuux', 'Foo', 'Foo', ExempleIndex);
 
Readln;
end.</syntaxhighlight>
=={{header|EasyLang}}==
<syntaxhighlight>
func$ txtbetween str$ start$ ende$ .
s = 1
if start$ <> "start"
s = strpos str$ start$
if s = 0
return ""
.
s += len start$
.
str$ = substr str$ s len str$
e = len str$
if ende$ <> "end"
e = strpos str$ ende$
if e = 0
return str$
.
e -= 1
.
return substr str$ 1 e
.
func$ q s$ .
return "\"" & s$ & "\""
.
texts$[] = [ "Hello Rosetta Code world" "Hello Rosetta Code world" "Hello Rosetta Code world" "</div><div style=\"chinese\">你好嗎</div>" "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">" "<table style=\"myTable\"><tr><td>hello world</td></tr></table>" "The quick brown fox jumps over the lazy other fox" "One fish two fish red fish blue fish" "FooBarBazFooBuxQuux" ]
starts$[] = [ "Hello " "start" "Hello " "<div style=\"chinese\">" "<text>" "<table>" "quick " "fish " "Foo" ]
ends$[] = [ " world" " world" "end" "</div>" "<table>" "</table>" " fox" " red" "Foo" ]
for i to len texts$[]
print q texts$[i]
print q starts$[i] & " : " & q ends$[i]
print q txtbetween texts$[i] starts$[i] ends$[i]
print ""
.
</syntaxhighlight>
{{out}}
<pre>
"Hello Rosetta Code world"
"Hello " : " world"
"Rosetta Code"
 
"Hello Rosetta Code world"
"start" : " world"
"Hello Rosetta Code"
 
"Hello Rosetta Code world"
"Hello " : "end"
"Rosetta Code world"
 
"</div><div style="chinese">你好嗎</div>"
"<div style="chinese">" : "</div>"
"你好嗎"
 
"<text>Hello <span>Rosetta Code</span> world</text><table style="myTable">"
"<text>" : "<table>"
"Hello <span>Rosetta Code</span> world</text><table style="myTable">"
 
"<table style="myTable"><tr><td>hello world</td></tr></table>"
"<table>" : "</table>"
""
 
"The quick brown fox jumps over the lazy other fox"
"quick " : " fox"
"brown"
 
"One fish two fish red fish blue fish"
"fish " : " red"
"two fish"
 
"FooBarBazFooBuxQuux"
"Foo" : "Foo"
"BarBaz"
</pre>
 
=={{header|Factor}}==
<syntaxhighlight lang="factor">USING: combinators formatting kernel locals math
prettyprint.config sequences ;
IN: rosetta-code.text-between
 
:: start ( sdelim text -- n )
{
{ [ sdelim "start" = ] [ 0 ] }
{ [ sdelim text subseq-start ] [ sdelim text subseq-start sdelim length + ] }
[ text length ]
} cond ;
 
:: end ( edelim text i -- n )
{
{ [ edelim "end" = ] [ text length ] }
{ [ edelim text i subseq-start-from ] [ edelim text i subseq-start-from ] }
[ text length ]
} cond ;
 
:: text-between ( text sdelim edelim -- seq )
sdelim text start :> start-index
edelim text start-index end :> end-index
start-index end-index text subseq ;
 
: text-between-demo ( -- )
{
{ "Hello Rosetta Code world" "Hello " " world" }
{ "Hello Rosetta Code world" "start" " world" }
{ "Hello Rosetta Code world" "Hello " "end" }
{ "</div><div style=\"chinese\">你好嗎</div>" "<div style=\"chinese\">" "</div>" }
{ "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">" "<text>" "<table>" }
{ "<table style=\"myTable\"><tr><td>hello world</td></tr></table>" "<table>" "</table>" }
{ "The quick brown fox jumps over the lazy other fox" "quick " " fox" }
{ "One fish two fish red fish blue fish" "fish " " red" }
{ "FooBarBazFooBuxQuux" "Foo" "Foo" }
}
[
first3 3dup text-between [
"Text: %u\nStart delimiter: %u\nEnd delimiter: %u\nOutput: %u\n\n"
printf
] without-limits ! prevent the prettyprinter from culling output
] each ;
 
MAIN: text-between-demo</syntaxhighlight>
{{out}}
<pre>
Text: "Hello Rosetta Code world"
Start delimiter: "Hello "
End delimiter: " world"
Output: "Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start delimiter: "start"
End delimiter: " world"
Output: "Hello Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start delimiter: "Hello "
End delimiter: "end"
Output: "Rosetta Code world"
 
Text: "</div><div style=\"chinese\">你好嗎</div>"
Start delimiter: "<div style=\"chinese\">"
End delimiter: "</div>"
Output: "你好嗎"
 
Text: "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
Start delimiter: "<text>"
End delimiter: "<table>"
Output: "Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
 
Text: "<table style=\"myTable\"><tr><td>hello world</td></tr></table>"
Start delimiter: "<table>"
End delimiter: "</table>"
Output: ""
 
Text: "The quick brown fox jumps over the lazy other fox"
Start delimiter: "quick "
End delimiter: " fox"
Output: "brown"
 
Text: "One fish two fish red fish blue fish"
Start delimiter: "fish "
End delimiter: " red"
Output: "two fish"
 
Text: "FooBarBazFooBuxQuux"
Start delimiter: "Foo"
End delimiter: "Foo"
Output: "BarBaz"
</pre>
 
=={{header|FreeBASIC}}==
{{trans|VBA}}
<syntaxhighlight lang="freebasic">Const DELIM_INICIO As String = "start"
Const DELIM_FINAL As String = "end"
 
Function Text_Between(T As String, F As String, L As String) As String
Dim As Long i = Instr(T, L) + 1
If T = "" Or F = "" Or (Instr(T, F) = 0 And F <> DELIM_INICIO) Then
Return ""
Elseif F = DELIM_INICIO And L = DELIM_FINAL Then
Return T
Elseif F = DELIM_INICIO Then
Return Mid(T, 1, Instr(T, L) - 1)
Elseif L = DELIM_FINAL Or Instr(T, L) = 0 Or (Instr(T, L) < Instr(T, F) And Instr(i, T, L) = 0) Then
Return Mid(T, Len(F) + Instr(T, F))
Elseif F = L Then
Return Mid(T, Len(F) + Instr(T, F) Or Instr(i, T, F) - Len(F) - 1)
Else
Return Mid(T, Len(F) + Instr(T, F), Instr(Instr(T, F), T, L) - (Len(F) + Instr(T, F)))
End If
End Function
 
Dim Texto As String, Inicio As String, Final As String, Salida As String
'Ejemplo 1. Both delimiters set
Texto = "Hello Rosetta Code world"
Inicio = "Hello "
Final = " world"
Salida = "1- " + Text_Between(Texto, Inicio, Final) + Chr(10)
'Ejemplo 2. start delimiter is the start of the string
Texto = "Hello Rosetta Code world"
Inicio = "start"
Final = " world"
Salida += "2- " + Text_Between(Texto, Inicio, Final) + Chr(10)
'Ejemplo 3. end delimiter is the end of the string
Texto = "Hello Rosetta Code world"
Inicio = "Hello "
Final = "end"
Salida += "3- " + Text_Between(Texto, Inicio, Final) + Chr(10)
'Ejemplo 4. end delimiter appears before and after start delimiter
Texto = "</div><div style=\""chinese\"">???</div>..."
Inicio = "<div style=\""chinese\"">"
Final = "</div>"
Salida += "4- " + Text_Between(Texto, Inicio, Final) + Chr(10)
'Ejemplo 5. end delimiter not present
Texto = "<Texto>Hello <span>Rosetta Code</span> world</Texto><table style=\""myTable\"">"
Inicio = "<Texto>"
Final = "<table>"
Salida += "5- " + Text_Between(Texto, Inicio, Final) + Chr(10)
'Ejemplo 6. start delimiter not present
Texto = "<table style=\""myTable\""><tr><td>hello world</td></tr></table>"
Inicio = "<table>"
Final = "</table>"
Salida += "6- " + Text_Between(Texto, Inicio, Final) + Chr(10)
'Ejemplo 7. Multiple instances of end delimiter after start delimiter (match until the Inicio one)
Texto = "The quick brown fox jumps over the lazy other fox"
Inicio = "quick "
Final = " fox"
Salida += "7- " + Text_Between(Texto, Inicio, Final) + Chr(10)
'Ejemplo 8. Multiple instances of the start delimiter (start matching at the Inicio one)
Texto = "One fish two fish red fish blue fish"
Inicio = "fish "
Final = " red"
Salida += "8- " + Text_Between(Texto, Inicio, Final) + Chr(10)
'Ejemplo 9. start delimiter is end delimiter
Texto = "FooBarBazFooBuxQuux"
Inicio = "Foo"
Final = "Foo"
Salida += "9- " + Text_Between(Texto, Inicio, Final) + Chr(10)
'Ejemplo 10 : end delimiter appears before and NOT after start delimiter
Texto = "</div><div style=\""chinese\"">???..."
Inicio = "<div style=\""chinese\"">"
Final = "</div>"
Salida += "10- " + Text_Between(Texto, Inicio, Final) + Chr(10)
'Ejemplo 11. Texto = ""
Texto = ""
Inicio = "start"
Final = "end"
Salida += "11- " + Text_Between(Texto, Inicio, Final) + Chr(10)
'Ejemplo 12. start and end delimiters use special values
Texto = "Hello Rosetta Code world"
Inicio = "start"
Final = "end"
Salida += "12- " + Text_Between(Texto, Inicio, Final)
'Resultado:
Print Salida
Sleep</syntaxhighlight>
{{out}}
<pre>
1- Rosetta Code
2- Hello Rosetta Code
3- Rosetta Code world
4- ???
5- Hello <span>Rosetta Code</span> world</Texto><table style=\"myTable\">
6-
7- brown
8- two fish
9- rBazFooBuxQuux
10- ???...
11-
12- Hello Rosetta Code world
</pre>
 
 
=={{header|Go}}==
{{trans|Kotlin}}
<syntaxhighlight lang="go">package main
 
import (
"fmt"
"strings"
)
 
func textBetween(str, start, end string) string {
if str == "" || start == "" || end == "" {
return str
}
s := 0
if start != "start" {
s = strings.Index(str, start)
}
if s == -1 {
return ""
}
si := 0
if start != "start" {
si = s + len(start)
}
e := len(str)
if end != "end" {
e = strings.Index(str[si:], end)
if e == -1 {
return str[si:]
}
e += si
}
return str[si:e]
}
 
func main() {
texts := [9]string{
"Hello Rosetta Code world",
"Hello Rosetta Code world",
"Hello Rosetta Code world",
"</div><div style=\"chinese\">你好嗎</div>",
"<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">",
"<table style=\"myTable\"><tr><td>hello world</td></tr></table>",
"The quick brown fox jumps over the lazy other fox",
"One fish two fish red fish blue fish",
"FooBarBazFooBuxQuux",
}
starts:= [9]string{
"Hello ", "start", "Hello ", "<div style=\"chinese\">",
"<text>", "<table>", "quick ", "fish ", "Foo",
}
ends := [9]string{
" world", " world", "end", "</div>", "<table>",
"</table>", " fox", " red", "Foo",
}
for i, text := range texts {
fmt.Printf("Text: \"%s\"\n", text)
fmt.Printf("Start delimiter: \"%s\"\n", starts[i])
fmt.Printf("End delimiter: \"%s\"\n", ends[i])
b := textBetween(text, starts[i], ends[i])
fmt.Printf("Output: \"%s\"\n\n", b)
}
}</syntaxhighlight>
 
{{out}}
<pre>
Same as Kotlin entry.
</pre>
 
=={{header|Haskell}}==
<syntaxhighlight lang="haskell">import Control.Monad (join)
import Data.Bifunctor (bimap)
import Data.List (intercalate)
import Data.Maybe (fromMaybe)
import Data.Text (Text, breakOn, pack, stripPrefix, unpack)
 
----------------------- TEXT BETWEEN ---------------------
 
textBetween ::
(Either String Text, Either String Text) ->
Text ->
Text
textBetween (start, end) txt =
fromMaybe
(pack [])
( retain (stripPrefix <*>) snd start txt
>>= retain (Just .) fst end
)
where
retain sub part delim t =
either
(Just . const t)
(sub $ part . flip breakOn t)
delim
 
-------------------------- TESTS -------------------------
main :: IO ()
main = do
mapM_ print $ flip textBetween (head samples) <$> take 3 delims
flip textBetween (head samples)
putStrLn $
<$> take 3 delims
unlines $
(putStrLn . unlines) $
zipWith
( \d t -> intercalate (unpack $ textBetween d t) ["\"", "\""])
intercalate
(unpack $ textBetween d t)
["\"", "\""]
)
(drop 3 delims)
(tail samples)</lang>
 
samples :: [Text]
samples =
fmap
pack
[ "Hello Rosetta Code world",
"</div><div style=\"chinese\">你好吗</div>",
"<text>Hello <span>Rosetta Code</span> world"
<> "</text><table style=\"myTable\">",
"<table style=\"myTable\"><tr><td>"
<> "hello world</td></tr></table>"
]
 
delims :: [(Either String Text, Either String Text)]
delims =
fmap
(join bimap wrap)
[ ("Hello ", " world"),
("start", " world"),
("Hello", "end"),
("<div style=\"chinese\">", "</div>"),
("<text>", "<table>"),
("<text>", "</table>")
]
 
wrap :: String -> Either String Text
wrap x
| x `elem` ["start", "end"] = Left x
| otherwise = Right (pack x)</syntaxhighlight>
{{Out}}
<pre>"Rosetta Code"
Line 242 ⟶ 1,452:
"Hello <span>Rosetta Code</span> world</text><table style="myTable">"
""</pre>
 
=={{header|J}}==
'''Solution:'''
<syntaxhighlight lang="j">textBetween=: dyad define
text=. y
'start end'=. x
start=. ''"_^:('start'&-:) start
end=. text"_^:('end'&-:) end
end taketo start takeafter text
)</syntaxhighlight>
 
'''Example Usage:'''
<syntaxhighlight lang="j"> ('Hello ';' world') textBetween 'Hello Rosetta Code world'
Rosetta Code</syntaxhighlight>
 
'''Examples:'''
<syntaxhighlight lang="j"> Test_text=: <;._2 noun define
Hello Rosetta Code world
Hello Rosetta Code world
Hello Rosetta Code world
</div><div style=\"chinese\">你好嗎</div>
<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">
<table style=\"myTable\"><tr><td>hello world</td></tr></table>
The quick brown fox jumps over the lazy other fox
One fish two fish red fish blue fish
FooBarBazFooBuxQuux
)
 
Test_delim=: <"1 '|'&cut;._2 noun define
Hello | world
start| world
Hello |end
<div style=\"chinese\">|</div>
<text>|<table>
<table>|</table>
quick | fox
fish | red
Foo|Foo
)
 
Test_output=: <;._2 noun define
Rosetta Code
Hello Rosetta Code
Rosetta Code world
你好嗎
Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">
 
brown
two fish
BarBaz
)
 
Test_output = Test_delim textBetween&.> Test_text
1 1 1 1 1 1 1 1 1</syntaxhighlight>
 
=={{header|Java}}==
Line 249 ⟶ 1,513:
</pre>
 
<langsyntaxhighlight lang="java">
public class textBetween
{
Line 311 ⟶ 1,575:
} // end class TextBetween
</syntaxhighlight>
</lang>
 
=={{header|JavaScript}}==
===ES5===
<lang javascript>
<syntaxhighlight lang="javascript">
function textBetween(thisText, startString, endString)
{
Line 353 ⟶ 1,618:
return newText;
} // end textBetween
</syntaxhighlight>
</lang>
===ES6===
{{Trans|Haskell}}
Composed from a set of generic functions
<syntaxhighlight lang="javascript">(() => {
'use strict';
 
// TEXT BETWEEN ----------------------------------------------------------
 
// Delimiter pair -> Haystack -> Any enclosed text
// textBetween :: (Either String String, Either String String) ->
// String -> String
const textBetween = ([start, end], txt) => {
const
retain = (post, part, delim, t) =>
either(
d => just(const_(t, d)), // 'start' or 'end'. No clipping.
d => post(part(flip(breakOnDef)(t, d))), // One side of break
delim
),
mbResidue = bindMay(
retain( // Start token stripped from text after any break
curry(stripPrefix)(start.Right),
snd, start, txt
), // Left side of any break retained.
curry(retain)(just, fst, end)
);
return mbResidue.nothing ? (
""
) : mbResidue.just;
}
 
// GENERIC FUNCTIONS -----------------------------------------------------
 
// append (++) :: [a] -> [a] -> [a]
const append = (xs, ys) => xs.concat(ys);
 
// bindMay (>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
const bindMay = (mb, mf) =>
mb.nothing ? mb : mf(mb.just);
 
// Needle -> Haystack -> (prefix before match, match + rest)
// breakOnDef :: String -> String -> (String, String)
const breakOnDef = (pat, src) =>
Boolean(pat) ? (() => {
const xs = src.split(pat);
return xs.length > 1 ? [
xs[0], src.slice(xs[0].length)
] : [src, ''];
})() : undefined;
 
// const_ :: a -> b -> a
const const_ = (k, _) => k;
 
// Handles two or more arguments
// curry :: ((a, b) -> c) -> a -> b -> c
const curry = (f, ...args) => {
const go = xs => xs.length >= f.length ? (f.apply(null, xs)) :
function () {
return go(xs.concat(Array.from(arguments)));
};
return go([].slice.call(args));
};
 
// drop :: Int -> [a] -> [a]
// drop :: Int -> String -> String
const drop = (n, xs) => xs.slice(n);
 
// either :: (a -> c) -> (b -> c) -> Either a b -> c
const either = (lf, rf, e) => {
const ks = Object.keys(e);
return elem('Left', ks) ? (
lf(e.Left)
) : elem('Right', ks) ? (
rf(e.Right)
) : undefined;
};
 
// elem :: Eq a => a -> [a] -> Bool
const elem = (x, xs) => xs.includes(x);
 
// flip :: (a -> b -> c) -> b -> a -> c
const flip = f => (a, b) => f.apply(null, [b, a]);
 
// fst :: (a, b) -> a
const fst = pair => pair.length === 2 ? pair[0] : undefined;
 
// just :: a -> Just a
const just = x => ({
nothing: false,
just: x
});
 
// Left :: a -> Either a b
const Left = x => ({
Left: x
});
 
// map :: (a -> b) -> [a] -> [b]
const map = (f, xs) => xs.map(f);
 
// min :: Ord a => a -> a -> a
const min = (a, b) => b < a ? b : a;
 
// nothing :: () -> Nothing
const nothing = (optionalMsg) => ({
nothing: true,
msg: optionalMsg
});
 
// Right :: b -> Either a b
const Right = x => ({
Right: x
});
 
// show :: Int -> a -> Indented String
// show :: a -> String
const show = (...x) =>
JSON.stringify.apply(
null, x.length > 1 ? [x[1], null, x[0]] : x
);
 
// snd :: (a, b) -> b
const snd = tpl => Array.isArray(tpl) ? tpl[1] : undefined;
 
// stripPrefix :: Eq a => [a] -> [a] -> Maybe [a]
const stripPrefix = (pfx, s) => {
const
blnString = typeof pfx === 'string',
[xs, ys] = blnString ? (
[pfx.split(''), s.split('')]
) : [pfx, s];
const
sp_ = (xs, ys) => xs.length === 0 ? (
just(blnString ? ys.join('') : ys)
) : (ys.length === 0 || xs[0] !== ys[0]) ? (
nothing()
) : sp_(xs.slice(1), ys.slice(1));
return sp_(xs, ys);
};
 
// tailDef :: [a] -> [a]
const tailDef = xs => xs.length > 0 ? xs.slice(1) : [];
 
// take :: Int -> [a] -> [a]
const take = (n, xs) => xs.slice(0, n);
 
// zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
const zipWith = (f, xs, ys) =>
Array.from({
length: Math.min(xs.length, ys.length)
}, (_, i) => f(xs[i], ys[i], i));
 
 
// TESTS -----------------------------------------------------------------
 
// samples :: [String]
const samples = [
'Hello Rosetta Code world',
'</div><div style=\'chinese\'>你好吗</div>',
'<text>Hello <span>Rosetta Code</span> world</text><table style=\'myTable\'>',
'<table style=\'myTable\'><tr><td>hello world</td></tr></table>'
];
 
// delims :: [(Either String String, Either String String)]
const delims = map(
curry(map)(x =>
elem(x, ['start', 'end']) ? (
Left(x) // Marker token
) : Right(x) // Literal text
), [
['Hello ', ' world'],
['start', ' world'],
['Hello', 'end'],
['<div style=\'chinese\'>', '</div>'],
['<text>', '<table>'],
['<text>', '</table>']
]);
 
return show(2,
append(
map(
fromTo => textBetween(fromTo, samples[0]),
take(3, delims)
), zipWith(
textBetween,
drop(3, delims),
tailDef(samples)
)
)
);
})();</syntaxhighlight>
{{Out}}
<pre>[
"Rosetta Code",
"Hello Rosetta Code",
" Rosetta Code world",
"你好吗",
"Hello <span>Rosetta Code</span> world</text><table style='myTable'>",
""
]</pre>
 
=={{header|jq}}==
 
The implementation uses `explode` to ensure arbitrary Unicode will be handled properly.
<syntaxhighlight lang="jq">
def textbetween_strings($startdlm; $enddlm):
explode
| . as $in
| (if $startdlm == "start" then 0 else ($startdlm | length) end) as $len
| (if $startdlm == "start" then 0 else index($startdlm | explode) end) as $ix
| if $ix
then $in[$ix + $len:]
| if $enddlm == "end" then .
else index($enddlm | explode) as $ex
| if $ex then .[:$ex] else . end
end
else []
end
| implode;
</syntaxhighlight>
=== Verification ===
 
<syntaxhighlight lang="text">
def testdata:
(["Hello Rosetta Code world", "Hello ", " world"],
["Hello Rosetta Code world", "start", " world"],
["Hello Rosetta Code world", "Hello", "end"],
["</div><div style=\"chinese\">你好嗎</div>", "<div style=\"chinese\">", "</div>"],
["<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">", "<text>", "<table>"],
["<table style=\"myTable\"><tr><td>hello world</td></tr></table>", "<table>", "</table>"],
["The quick brown fox jumps over the lazy other fox", "quick ", " fox"],
["One fish two fish red fish blue fish", "fish ", " red"],
["FooBarBazFooBuxQuux", "Foo", "Foo"] )
;
testdata
| . as $in
| $in[0]
| textbetween_strings($in[1]; $in[2])
</syntaxhighlight>
===Output===
<syntaxhighlight lang="text">
"Rosetta Code"
"Hello Rosetta Code"
" Rosetta Code world"
"你好嗎"
"Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
""
"brown"
"two fish"
"BarBaz"
</syntaxhighlight>
 
=={{header|Julia}}==
{{works with|Julia|0.6}}
 
<syntaxhighlight lang="julia">function textbetween(text::AbstractString, startdlm::AbstractString, enddlm::AbstractString)
startind = startdlm != "start" ? last(search(text, startdlm)) + 1 : 1
endind = enddlm != "end" ? first(search(text, enddlm, startind)) - 1 : endof(text)
if iszero(startind) || iszero(endind) return "" end
return text[startind:endind]
end
 
testcases = [("Hello Rosetta Code world", "Hello ", " world"),
("Hello Rosetta Code world", "start", " world"),
("Hello Rosetta Code world", "Hello", "end"),
("</div><div style=\"chinese\">你好嗎</div>", "<div style=\"chinese\">", "</div>"),
("<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">", "<text>", "<table>"),
("<table style=\"myTable\"><tr><td>hello world</td></tr></table>", "<table>", "</table>"),
("The quick brown fox jumps over the lazy other fox", "quick ", " fox"),
("One fish two fish red fish blue fish", "fish ", " red"),
("FooBarBazFooBuxQuux", "Foo", "Foo")]
 
 
for (text, s, e) in testcases
println("\nText: ", text, "\nStart delim: ", s, "\nEnd delim: ", e, "\nOutput: ", textbetween(text, s, e))
end</syntaxhighlight>
 
{{out}}
<pre>Text: Hello Rosetta Code world
Start delim: Hello
End delim: world
Output: Rosetta Code
 
Text: Hello Rosetta Code world
Start delim: start
End delim: world
Output: Hello Rosetta Code
 
Text: Hello Rosetta Code world
Start delim: Hello
End delim: end
Output: Rosetta Code world
 
Text: </div><div style="chinese">你好嗎</div>
Start delim: <div style="chinese">
End delim: </div>
Output: 你好嗎
 
Text: <text>Hello <span>Rosetta Code</span> world</text><table style="myTable">
Start delim: <text>
End delim: <table>
Output:
 
Text: <table style="myTable"><tr><td>hello world</td></tr></table>
Start delim: <table>
End delim: </table>
Output:
 
Text: The quick brown fox jumps over the lazy other fox
Start delim: quick
End delim: fox
Output: brown
 
Text: One fish two fish red fish blue fish
Start delim: fish
End delim: red
Output: two fish
 
Text: FooBarBazFooBuxQuux
Start delim: Foo
End delim: Foo
Output: BarBaz</pre>
 
=={{header|Kotlin}}==
In the third example, I've assumed that the start delimiter should be "Hello " (not "Hello") to match the required output.
<lang scala>// version 1.2.10
<syntaxhighlight lang="scala">// version 1.2.10
 
/*
Returns original string if:
(1) either 'start' or 'end' doesn't occur in the string
(2) both occur but 'start' doesn't occur before 'end'
(3) both occur but they intersect
*/
fun String.textBetween(start: String, end: String): String {
require(!start.isEmpty() && !end.isEmpty())
if (this.isEmpty()) return this
val s = if (start.isEmpty() == "start") 0 else this.indexOf(start)
if (s == -1) return this""
val esi = if (end.isEmpty()start == "start") this.length0 else thiss + start.lastIndexOf(end)length
val e = if (eend == -1"end") returnthis.length else this.indexOf(end, si)
valif si(e == s-1) +return startthis.lengthsubstring(si)
if (si > e) return this
return this.substring(si, e)
}
 
fun main(args: Array<String>) {
val pairstexts = listOf(
"Hello Rosetta Code world",
"Hello Rosetta Code world",
"Hello Rosetta Code world",
"</div><div style=\"chinese\">你好嗎</div>",
"<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">",
"<table style=\"myTable\"><tr><td>hello world</td></tr></table>",
"The quick brown fox jumps over the lazy other fox",
"One fish two fish red fish blue fish",
"FooBarBazFooBuxQuux"
)
val startEnds = listOf(
"Hello " to " world",
"start" to " world",
"Hello " to "end",
"Hello Rosetta<div style=\"chinese\">" to "Code world</div>", // empty string between
"Hello Rosetta<text>" to "Code world<table>", // space between
"Code<table>" to "Hello</table>", // start occurs after end
"Helloquick Rosetta Code" to "Code worldfox", // start and end intersect
"Goodbyefish " to "Code worldred" // start doesn't occur at all,
"Foo" to "Foo"
)
for ((i, text) in texts.withIndex()) {
val str = "Hello Rosetta Code world"
println("UsingText: the string '\"$str':text\"")
for val ((starts, ende) in pairs)= {startEnds[i]
val s = if println(start"Start ==delimiter: \"$s\"") "<start>" else start
val e = if println(end"End ==delimiter: \"$e\"") "<end>" else end
val b = strtext.textBetween(starts, ende)
println("Output: text between '$s' and '$e' is '\"$b'\"\n")
}
}</langsyntaxhighlight>
 
{{out}}
<pre>
UsingText: the string '"Hello Rosetta Code world':"
Start delimiter: "Hello "
text between 'Hello ' and ' world' is 'Rosetta Code'
End delimiter: " world"
text between '<start>' and ' world' is 'Hello Rosetta Code'
Output: "Rosetta Code"
text between 'Hello' and '<end>' is ' Rosetta Code world'
 
text between 'Hello Rosetta ' and 'Code world' is ''
Text: text between '"Hello Rosetta' and 'Code world' is ' '"
Start delimiter: "start"
text between 'Code' and 'Hello' is 'Hello Rosetta Code world'
End delimiter: " world"
text between 'Hello Rosetta Code' and 'Code world' is 'Hello Rosetta Code world'
Output: text between 'Goodbye' and 'Code world' is '"Hello Rosetta Code world'"
 
Text: "Hello Rosetta Code world"
Start delimiter: "Hello "
End delimiter: "end"
Output: "Rosetta Code world"
 
Text: "</div><div style="chinese">你好嗎</div>"
Start delimiter: "<div style="chinese">"
End delimiter: "</div>"
Output: "你好嗎"
 
Text: "<text>Hello <span>Rosetta Code</span> world</text><table style="myTable">"
Start delimiter: "<text>"
End delimiter: "<table>"
Output: "Hello <span>Rosetta Code</span> world</text><table style="myTable">"
 
Text: "<table style="myTable"><tr><td>hello world</td></tr></table>"
Start delimiter: "<table>"
End delimiter: "</table>"
Output: ""
 
Text: "The quick brown fox jumps over the lazy other fox"
Start delimiter: "quick "
End delimiter: " fox"
Output: "brown"
 
Text: "One fish two fish red fish blue fish"
Start delimiter: "fish "
End delimiter: " red"
Output: "two fish"
 
Text: "FooBarBazFooBuxQuux"
Start delimiter: "Foo"
End delimiter: "Foo"
Output: "BarBaz"
</pre>
 
=={{header|Perl 6Lua}}==
French (instead of Chinese) in #4 to avoid off-topic unicode complications. Coded to satisfy this task as worded, though in actual use reader might be better served by directly applying native pattern matching facilities to specific problems.
{{works with|Rakudo|2017.12}}
<syntaxhighlight lang="lua">function textbetween(text, sdelim, edelim)
It seems somewhat pointless to write a general purpose routine to do text matching as built-in primitives can do so more flexibly and concisely, but whatever.
-- case #5 (end delimiter not present) is only problem for simplest approach, so preprocess:
if not text:find(edelim=="end" and "$" or edelim) then edelim = "end" end
-- then just:
local re = (sdelim=="start" and "^" or sdelim) .. "(.-)" .. (edelim=="end" and "$" or edelim)
return text:match(re) or ""
end
 
function test(text, sdelim, edelim, expected)
<lang perl6>sub text-between ( $text, $start, $end ) {
print(textbetween(text, sdelim, edelim) == expected)
return $/»[0]».Str if $text ~~ m:g/ $start (.*?) $end /;
end
[]
 
test( "Hello Rosetta Code world", "Hello ", " world", "Rosetta Code" )
test( "Hello Rosetta Code world", "start", " world", "Hello Rosetta Code" )
test( "Hello Rosetta Code world", "Hello ", "end", "Rosetta Code world" )
test( "</div><div style=\"french\">bonjour</div>", "<div style=\"french\">", "</div>", "bonjour" )
test( "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">", "<text>", "<table>", "Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">" )
test( "<table style=\"myTable\"><tr><td>hello world</td></tr></table>", "<table>", "</table>", "" )
test( "The quick brown fox jumps over the lazy other fox", "quick ", " fox", "brown" )
test( "One fish two fish red fish blue fish", "fish ", " red", "two fish" )
test( "FooBarBazFooBuxQuux", "Foo", "Foo", "BarBaz" )</syntaxhighlight>
{{Out}}
All tests pass, output not given.
 
=={{header|Maple}}==
<syntaxhighlight lang="maple">textBetween := proc(str,delim1,delim2)
local on, off,extra:
on := piecewise(delim1="start", 1, SearchText(delim1, str)):
if on = 0 then return ""; end if:
extra := piecewise(delim1="start", 0, StringTools:-Length(delim1)):
off := piecewise(delim2="end", 0, SearchText(delim2, str, on+extra..-1)):
if off <> 0 then off := off+on+extra-1: end if:
return str[on+extra..off-1]:
end proc:</syntaxhighlight>
{{Out|Examples}}
<pre>>textBetween("Hello Rosetta Code world", "Hello ", " world");
"Rosetta Code"
>textBetween("Hello Rosetta Code world", "start", " world");
"Hello Rosetta Code"
>textBetween("Hello Rosetta Code world", "Hello ", "end");
"Rosetta Code world"
>textBetween("</div><div style=\"chinese\">你好嗎</div>", "<div style=\"chinese\">", "</div>");
"你好嗎"
>textBetween("<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">","<text>","<table>");
"Hello <span>Rosetta Code</span> world</text><table style="myTable">"
>textBetween("<table style=\"myTable\"><tr><td>hello world</td></tr></table>", "<table>", "</table>");
""
>textBetween("The quick brown fox jumps over the lazy other fox", "quick ", " fox");
"brown"
>textBetween("One fish two fish red fish blue fish", "fish ", " red");
"two fish"
>textBetween("FooBarBazFooBuxQuux", "Foo", "Foo");
"BarBaz"</pre>
 
=={{header|MiniScript}}==
<syntaxhighlight lang="miniscript">textBetween = function(s, startDelim, endDelim)
startPos = s.indexOf(startDelim) + startDelim.len
if startDelim == "start" then startPos = 0
endPos = s.indexOf(endDelim, startPos)
if endDelim == "end" then endDelim = null
return s[startPos:endPos]
end function
 
print textBetween("Hello Rosetta Code world", "Hello ", " world")
print textBetween("Hello Rosetta Code world", "start", " world")
print textBetween("Hello Rosetta Code world", "Hello ", "end")
print textBetween("The quick brown fox jumps over the lazy other fox", "quick ", " fox")
print textBetween("FooBarBazFooBuxQuux", "Foo", "Foo")</syntaxhighlight>
 
{{out}}
 
<pre>Rosetta Code
Hello Rosetta Code
Rosetta Code world
brown
BarBaz</pre>
 
=={{header|Nim}}==
<syntaxhighlight lang="nim">import strutils
 
func textBetween(text, startStr, endStr: string): string =
## Return the text between start and end separators.
 
var startIdx = 0
if startStr != "start":
startIdx = text.find(startStr)
if startIdx == -1: return
inc startIdx, startStr.len
 
var endIdx = text.high
if endStr != "end":
endIdx = text.find(endStr, startIdx)
if endIdx == -1: endIdx = text.high
else: dec endIdx
 
result = text.substr(startIdx, endIdx)
 
 
proc quote(s: string): string =
## Return a quoted string, i.e with escaped chars but
## keeping unchanged characters between \128 and \255.
result.addQuoted(s)
 
 
const Data = [
("Hello Rosetta Code world", "Hello ", " world"),
("Hello Rosetta Code world", "start", " world"),
("Hello Rosetta Code world", "Hello ", "end"),
("</div><div style=\"chinese\">你好嗎</div>", "<div style=\"chinese\">", "</div>"),
("<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">", "<text>", "<table>"),
("<table style=\"myTable\"><tr><td>hello world</td></tr></table>", "<table>", "</table>"),
("The quick brown fox jumps over the lazy other fox", "quick ", " fox"),
("One fish two fish red fish blue fish", "fish ", " red"),
("FooBarBazFooBuxQuux", "Foo", "Foo")]
 
for (text, startStr, endStr) in Data:
echo "Text: ", text.quote
echo "Start: ", startStr.quote
echo "End: ", endStr.quote
echo "Output: ", text.textBetween(startStr, endStr).quote
echo()</syntaxhighlight>
 
{{out}}
<pre>Text: "Hello Rosetta Code world"
Start: "Hello "
End: " world"
Result: "Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start: "start"
End: " world"
Result: "Hello Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start: "Hello "
End: "end"
Result: "Rosetta Code world"
 
Text: "</div><div style=\"chinese\">你好嗎</div>"
Start: "<div style=\"chinese\">"
End: "</div>"
Result: "你好嗎"
 
Text: "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
Start: "<text>"
End: "<table>"
Result: "Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
 
Text: "<table style=\"myTable\"><tr><td>hello world</td></tr></table>"
Start: "<table>"
End: "</table>"
Result: ""
 
Text: "The quick brown fox jumps over the lazy other fox"
Start: "quick "
End: " fox"
Result: "brown"
 
Text: "One fish two fish red fish blue fish"
Start: "fish "
End: " red"
Result: "two fish"
 
Text: "FooBarBazFooBuxQuux"
Start: "Foo"
End: "Foo"
Result: "BarBaz"</pre>
 
=={{header|Objeck}}==
{{trans|Java}}
<syntaxhighlight lang="objeck">class TextBetween {
function : Main(args : String[]) ~ Nil {
if(args->Size() = 3) {
TextBetween(args[0], args[1], args[2])->PrintLine();
};
}
 
function : TextBetween(thisText : String, startString : String, endString : String) ~ String {
startIndex := 0;
endIndex := 0;
 
if (startString->Equals("start"))
{
startIndex := 0;
} else {
startIndex := thisText->Find(startString);
if (startIndex < 0)
{
return "";
} else {
startIndex := startIndex + startString->Size();
};
};
 
if (endString->Equals("end"))
{
endIndex := thisText->Size();
} else {
endIndex := thisText->Find(endString);
if (endIndex <= 0)
{
return "";
} else {
};
};
 
return thisText->SubString(startIndex, endIndex - startIndex);
}
}</syntaxhighlight>
 
=={{header|Perl}}==
{{trans|Raku}}
<syntaxhighlight lang="perl">use feature 'say';
 
sub text_between {
my($text, $start, $end) = @_;
return join ',', $text =~ /$start(.*?)$end/g;
}
 
$text = 'Hello Rosetta Code world';
# Testing
my $text = 'Hello Rosetta Code world';
 
# String start and end delimiter
putsay '1> ',. text_between($text.&text-between(, 'Hello ', ' world' );
 
# Regex string start delimiter
putsay '2> ',. text_between($text.&text-between(, rxqr/^/, ' world' );
 
# Regex string end delimiter
putsay '3> ',. text_between($text.&text-between(, 'Hello ', rxqr/$/ );
 
# Return all matching strings when multiple matches are possible
put '4> ', join ',', $text.&text-between( 'e', 'o' );
 
# End delimiter only valid after start delimiter
putsay '54> ',. text_between('</div><div style="chinese">你好嗎</div>'\, '<div style="chinese">', '</div>' );
.&text-between( '<div style="chinese">', '</div>' );
 
# End delimiter ornot stringfound, enddefault ifto notstring foundend
putsay '65> ',. text_between('<text>Hello <span>Rosetta Code</span> world</text><table style="myTable">'\, '<text>', qr/<table>|$/ );
.&text-between( '<text>', rx/'<table>' | $/ );
 
# Start delimiter not found, return blank string
putsay '76> ',. text_between('<table style="myTable"><tr><td>hello world</td></tr></table>'\, '<table>', '</table>' );
 
.&text-between( '<table>', '</table>' );</lang>
# Multiple end delimiters, match frugally
say '7> '. text_between( 'The quick brown fox jumps over the lazy other fox', 'quick ', ' fox' );
 
# Multiple start delimiters, match frugally
say '8> '. text_between( 'One fish two fish red fish blue fish', 'fish ', ' red' );
 
# Start delimiter is end delimiter
say '9> '. text_between('FooBarBazFooBuxQuux', 'Foo', 'Foo' );
 
# Return all matching strings when multiple matches are possible
say '10> '. text_between( $text, 'e', 'o' );
 
# Ignore start and end delimiter string embedded in longer words
$text = 'Soothe a guilty conscience today, string wrangling is not the best tool to use for this job.';
say '11> '. text_between($text, qr/\bthe /, qr/ to\b/);</syntaxhighlight>
{{out}}
<pre>1> Rosetta Code
2> Hello Rosetta Code
3> Rosetta Code world
4> ll,tta C, w你好嗎
5> Hello <span>Rosetta Code</span> world</text><table style="myTable">
5> 你好嗎
6>
6> Hello <span>Rosetta Code</span> world</text><table style="myTable">
7> </pre>brown
8> two fish
9> BarBaz
10> ll,tta C, w
11> best tool</pre>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">function</span> <span style="color: #000000;">text_between</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">text</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">start_delimiter</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">end_delimiter</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">start_delimiter</span><span style="color: #0000FF;">!=</span><span style="color: #008000;">"start"</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #000000;">start_delimiter</span><span style="color: #0000FF;">,</span><span style="color: #000000;">text</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #008000;">""</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">text</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">text</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">+</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">start_delimiter</span><span style="color: #0000FF;">)..$]</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">end_delimiter</span><span style="color: #0000FF;">!=</span><span style="color: #008000;">"end"</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #000000;">end_delimiter</span><span style="color: #0000FF;">,</span><span style="color: #000000;">text</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">text</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">text</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">k</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">text</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"Hello Rosetta Code world"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Hello "</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" world"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Rosetta Code"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"Hello Rosetta Code world"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"start"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" world"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Hello Rosetta Code"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"Hello Rosetta Code world"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Hello "</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"end"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Rosetta Code world"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"&lt;/div&gt;&lt;div style=\"french\"&gt;bonjour&lt;/div&gt;"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"&lt;div style=\"french\"&gt;"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"&lt;/div&gt;"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"bonjour"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"&lt;text&gt;Hello &lt;span&gt;Rosetta Code&lt;/span&gt; world&lt;/text&gt;&lt;table style=\"myTable\"&gt;"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"&lt;text&gt;"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"&lt;table&gt;"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Hello &lt;span&gt;Rosetta Code&lt;/span&gt; world&lt;/text&gt;&lt;table style=\"myTable\"&gt;"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"&lt;table style=\"myTable\"&gt;&lt;tr&gt;&lt;td&gt;hello world&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"&lt;table&gt;"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"&lt;/table&gt;"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"The quick brown fox jumps over the lazy other fox"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"quick "</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" fox"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"brown"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"One fish two fish red fish blue fish"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"fish "</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" red"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"two fish"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"FooBarBazFooBuxQuux"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Foo"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Foo"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"BarBaz"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"Hello Rosetta Code world"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"start"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"end"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Hello Rosetta Code world"</span><span style="color: #0000FF;">}}</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">fmt</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
Text: "%s"
Start delimiter: "%s"
End delimiter: "%s"
Output: "%s"
Expect: "%s" ***ERROR***
"""</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">string</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">text</span><span style="color: #0000FF;">,</span><span style="color: #000000;">start_delimiter</span><span style="color: #0000FF;">,</span><span style="color: #000000;">end_delimiter</span><span style="color: #0000FF;">,</span><span style="color: #000000;">expected</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">actual</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">text_between</span><span style="color: #0000FF;">(</span><span style="color: #000000;">text</span><span style="color: #0000FF;">,</span><span style="color: #000000;">start_delimiter</span><span style="color: #0000FF;">,</span><span style="color: #000000;">end_delimiter</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">actual</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">expected</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fmt</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">text</span><span style="color: #0000FF;">,</span><span style="color: #000000;">start_delimiter</span><span style="color: #0000FF;">,</span><span style="color: #000000;">end_delimiter</span><span style="color: #0000FF;">,</span><span style="color: #000000;">actual</span><span style="color: #0000FF;">,</span><span style="color: #000000;">expected</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</syntaxhighlight>-->
{{out}}
All tests pass, so no output.
 
=={{header|PHP}}==
Line 459 ⟶ 2,365:
</pre>
 
<langsyntaxhighlight lang="php">
<?php
function text_between($string, $start, $end)
Line 505 ⟶ 2,411:
print_r($returnText);
?>
</syntaxhighlight>
</lang>
 
=={{header|PowerBASIC}}==
<syntaxhighlight lang="powerbasic">#COMPILE EXE
#DIM ALL
#COMPILER PBCC 6
 
'*********************
 
FUNCTION TextBetween( _
BYVAL Text AS WSTRING, _
BYVAL StartDelim AS WSTRING, _
BYVAL EndDelim AS WSTRING) _
AS WSTRING
 
LOCAL indS AS LONG
LOCAL indE AS LONG
 
IF StartDelim = "start" THEN
indS = 1
ELSE
indS = INSTR(1, TEXT, StartDelim)
IF indS THEN
indS += LEN(StartDelim)
END IF
END IF
 
IF indS THEN
IF EndDelim = "end" THEN
indE = LEN(TEXT) + 1
ELSE
indE = INSTR(indS, TEXT, EndDelim)
IF indE = 0 THEN
indE = LEN(TEXT) + 1
END IF
END IF
indE -= indS
IF indE THEN
FUNCTION = MID$(TEXT, indS, indE)
END IF
END IF
 
END FUNCTION
 
'*********************
 
FUNCTION PBMAIN () AS LONG
LOCAL sText AS WSTRING
LOCAL StartDelim AS WSTRING
LOCAL EndDelim AS WSTRING
LOCAL Expected AS WSTRING
 
'Ex. 1
sText = "Hello Rosetta Code world"
StartDelim = "Hello "
EndDelim = " world"
Expected = "Rosetta Code"
CON.PRINT IIF$(TextBetween(sText, StartDelim, EndDelim) = Expected, "OK", "failed")
 
'Ex. 2
sText = "Hello Rosetta Code world"
StartDelim = "start"
EndDelim = " world"
Expected = "Hello Rosetta Code"
CON.PRINT IIF$(TextBetween(sText, StartDelim, EndDelim) = Expected, "OK", "failed")
 
'Ex. 3
sText = "Hello Rosetta Code world"
StartDelim = "Hello "
EndDelim = "end"
Expected = "Rosetta Code world"
CON.PRINT IIF$(TextBetween(sText, StartDelim, EndDelim) = Expected, "OK", "failed")
 
'Ex. 4
Expected = CHR$$(&H4F60) & CHR$$(&H597D) & CHR$$(&H55CE)
sText = "</div><div style=""chinese"">" & Expected & "</div>"
StartDelim = "<div style=""chinese"">"
EndDelim = "</div>"
CON.PRINT IIF$(TextBetween(sText, StartDelim, EndDelim) = Expected, "OK", "failed")
 
'Ex. 5
sText = "<text>Hello <span>Rosetta Code</span> world</text><table style=""myTable"">"
StartDelim = "<text>"
EndDelim = "<table>"
Expected = "Hello <span>Rosetta Code</span> world</text><table style=""myTable"">"
CON.PRINT IIF$(TextBetween(sText, StartDelim, EndDelim) = Expected, "OK", "failed")
 
'Ex. 6
sText = "<table style=""myTable""><tr><td>hello world</td></tr></table>"
StartDelim = "<table>"
EndDelim = "</table>"
Expected = ""
CON.PRINT IIF$(TextBetween(sText, StartDelim, EndDelim) = Expected, "OK", "failed")
 
'Ex. 7
sText = "The quick brown fox jumps over the lazy other fox"
StartDelim = "quick "
EndDelim = " fox"
Expected = "brown"
CON.PRINT IIF$(TextBetween(sText, StartDelim, EndDelim) = Expected, "OK", "failed")
 
'Ex. 8
sText = "One fish two fish red fish blue fish"
StartDelim = "fish "
EndDelim = " red"
Expected = "two fish"
CON.PRINT IIF$(TextBetween(sText, StartDelim, EndDelim) = Expected, "OK", "failed")
 
'Ex. 9
sText = "FooBarBazFooBuxQuux"
StartDelim = "Foo"
EndDelim = "Foo"
Expected = "BarBaz"
CON.PRINT IIF$(TextBetween(sText, StartDelim, EndDelim) = Expected, "OK", "failed")
 
'Extra test: empty text between delimiters
StartDelim = "Foo"
EndDelim = "BarBaz"
Expected = ""
sText = StartDelim & Expected & EndDelim & "FooBuxQuux"
CON.PRINT IIF$(TextBetween(sText, StartDelim, EndDelim) = Expected, "OK", "failed")
 
END FUNCTION</syntaxhighlight>
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">
#!/usr/bin/env python
from sys import argv
Line 527 ⟶ 2,555:
return 'Start delimiter not found'
else:
if startString is not 'start':
startIndex = startIndex + len( startString )
startIndex = startIndex + len( startString )
returnText = thisText[startIndex:]
Line 553 ⟶ 2,582:
 
print textBetween( thisText, startString, endString )
</syntaxhighlight>
</lang>
 
=={{header|Quackery}}==
 
<syntaxhighlight lang="Quackery"> [ dup $ "start" = iff
drop done
tuck over findseq
tuck over found iff
[ unrot dip size +
split nip ]
done
2drop drop $ "" ] is from-start ( $ $ --> $ )
 
[ dup $ "end" = iff drop done
over findseq split drop ] is to-end ( $ $ --> $ )
 
[ dip from-start to-end ] is between ( $ $ $ --> $ )
 
[ char " tuck join join
echo$ cr ] is quote$ ( $ --> )
 
[ 3 pack dup
dip unpack unpack
rot say " Text: " quote$
swap say " Start: " quote$
say " End: " quote$
between
say "Result: " quote$
cr ] is task ( $ $ $ --> $ )
 
$ "Hello Rosetta Code world" $ "Hello " $ " world" task
$ "Hello Rosetta Code world" $ "start" $ " world" task
$ "Hello Rosetta Code world" $ "Hello " $ "end" task
$ "Hello Rosetta Code world" $ "Hello " $ "end" task
$ '</div><div style=\"chinese\">???</div>'
$ '<div style=\"chinese\">' $ "</div>" task
$ '<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">'
$ "<text>" $ "<table>" task
$ '<table style=\"myTable\"><tr><td>hello world</td></tr></table>'
$ "<table>" $ "</table>" task
$ "The quick brown fox jumps over the lazy other fox"
$ "quick " $ " fox" task
$ "One fish two fish red fish blue fish"
$ "fish " $ " red" task
$ "FooBarBazFooBuxQuux" $ "Foo" $ "Foo" task</syntaxhighlight>
 
{{out}}
 
<pre style="scroll: overflow; height: 20em"> Text: "Hello Rosetta Code world"
Start: "Hello "
End: " world"
Result: "Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start: "start"
End: " world"
Result: "Hello Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start: "Hello "
End: "end"
Result: "Rosetta Code world"
 
Text: "Hello Rosetta Code world"
Start: "Hello "
End: "end"
Result: "Rosetta Code world"
 
Text: "</div><div style=\"chinese\">???</div>"
Start: "<div style=\"chinese\">"
End: "</div>"
Result: "???"
 
Text: "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
Start: "<text>"
End: "<table>"
Result: "Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
 
Text: "<table style=\"myTable\"><tr><td>hello world</td></tr></table>"
Start: "<table>"
End: "</table>"
Result: ""
 
Text: "The quick brown fox jumps over the lazy other fox"
Start: "quick "
End: " fox"
Result: "brown"
 
Text: "One fish two fish red fish blue fish"
Start: "fish "
End: " red"
Result: "two fish"
 
Text: "FooBarBazFooBuxQuux"
Start: "Foo"
End: "Foo"
Result: "BarBaz"</pre>
 
=={{header|Racket}}==
<syntaxhighlight lang="racket">#lang racket
(require (prefix-in 13: srfi/13))
 
(define (text-to-end text end)
(cond [(13:string-contains text end) => (λ (i) (substring text 0 i))]
[else text]))
 
(define (text-from-start text start)
(cond [(13:string-contains text start) => (λ (i) (substring text (+ i (string-length start))))]
[else ""]))
 
(define text-between
(match-lambda**
[("start" "end" text) text]
[("start" end text) (text-to-end text end)]
[(start "end" text) (text-from-start text start)]
[(start end text) (text-to-end (text-from-start text start) end)]))
 
(module+ test
(require rackunit)
 
(define (test-case text start end output)
(check-equal? (text-between start end text) output))
 
(test-case "Hello Rosetta Code world" "Hello " " world" "Rosetta Code")
(test-case "Hello Rosetta Code world" "start" " world" "Hello Rosetta Code")
(test-case "Hello Rosetta Code world" "Hello" "end" " Rosetta Code world")
(test-case "</div><div style=\"chinese\">你好嗎</div>" "<div style=\"chinese\">" "</div>" "你好嗎")
(test-case "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">" "<text>" "<table>" "Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">")
(test-case "<table style=\"myTable\"><tr><td>hello world</td></tr></table>" "<table>" "</table>" "")
(test-case "The quick brown fox jumps over the lazy other fox" "quick " " fox" "brown")
(test-case "One fish two fish red fish blue fish" "fish " " red" "two fish")
(test-case "FooBarBazFooBuxQuux" "Foo" "Foo" "BarBaz"))</syntaxhighlight>
{{out}}
All tests pass, so no output.
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2017.12}}
It seems somewhat pointless to write a special purpose routine to do text matching as built-in primitives can do so more flexibly and concisely, but whatever.
 
This version doesn't use strings for meta indexes ('start' and 'end'), rather it accepts regex assertions which are parsed differently from strings. This allows much more robust and fine grained control over what does and doesn't match. (and allows delimiter strings of 'start' and 'end' incidentally.) See the 11th example below which will confound nearly all of the current string-only based implementations.
 
<syntaxhighlight lang="raku" line>sub text-between ( $text, $start, $end ) {
return $/»[0]».Str if $text ~~ m:g/ $start (.*?) $end /;
[]
}
 
# Testing
my $text = 'Hello Rosetta Code world';
 
# String start and end delimiter
put '1> ', $text.&text-between( 'Hello ', ' world' );
 
# Regex string start delimiter
put '2> ', $text.&text-between( rx/^/, ' world' );
 
# Regex string end delimiter
put '3> ', $text.&text-between( 'Hello ', rx/$/ );
 
# End delimiter only valid after start delimiter
put '4> ', '</div><div style="chinese">你好嗎</div>'\
.&text-between( '<div style="chinese">', '</div>' );
 
# End delimiter not found, default to string end
put '5> ', '<text>Hello <span>Rosetta Code</span> world</text><table style="myTable">'\
.&text-between( '<text>', rx/'<table>' | $/ );
 
# Start delimiter not found, return blank string
put '6> ', '<table style="myTable"><tr><td>hello world</td></tr></table>'\
.&text-between( '<table>', '</table>' );
 
# Multiple end delimiters, match frugally
put '7> ', 'The quick brown fox jumps over the lazy other fox'\
.&text-between( 'quick ', ' fox' );
 
# Multiple start delimiters, match frugally
put '8> ', 'One fish two fish red fish blue fish'\
.&text-between( 'fish ', ' red' );
 
# Start delimiter is end delimiter
put '9> ', 'FooBarBazFooBuxQuux'\
.&text-between( 'Foo', 'Foo' );
 
# Return all matching strings when multiple matches are possible
put '10> ', join ',', $text.&text-between( 'e', 'o' );
 
# Ignore start and end delimiter string embedded in longer words
put '11> ', 'Soothe a guilty conscience today, string wrangling is not the best tool to use for this job.'\
.&text-between( rx/«'the '/, rx/' to'»/ );</syntaxhighlight>
 
{{out}}
<pre>1> Rosetta Code
2> Hello Rosetta Code
3> Rosetta Code world
4> 你好嗎
5> Hello <span>Rosetta Code</span> world</text><table style="myTable">
6>
7> brown
8> two fish
9> BarBaz
10> ll,tta C, w
11> best tool</pre>
 
=={{header|REXX}}==
===version 1===
{{trans|Kotlin}}
<syntaxhighlight lang="rexx">
<lang rexx>Say 'Using the string ''Hello Rosetta Code world'':'
/*REXX*/
Call test 'Hello Rosetta Code world','Hello ',' world'
 
Call test 'Hello Rosetta Code world','<start>',' world'
Call test ' "Hello Rosetta Code world'",'"Hello' ",'<end>'" world"
Call test ' "Hello Rosetta Code world'",'Hello Rosetta '"start",'Code" world'"
Call test ' "Hello Rosetta Code world'",'"Hello Rosetta'",'Code world'"end"
Call test "</div><div style=""chinese"">???</div>","<div style=""chinese"">","</div>"
Call test 'Hello Rosetta Code world','Code','Hello'
Call test ' "<text>Hello <span>Rosetta Code</span> world','Hello</text><table Rosetta Code'style=""myTable"">",'Code world'"<text>","<table>"
Call test "<table style=""myTable""><tr><td>hello world</td></tr></table>","<table>","</table>"
Call test 'Hello Rosetta Code world','Goodbye','Code world'
Call test "The quick brown fox jumps over the lazy other fox","quick "," fox"
Call test "One fish two fish red fish blue fish","fish "," red"
Call test "FooBarBazFooBuxQuux","Foo","Foo"
Exit
 
Line 571 ⟶ 2,805:
Parse Arg t,s,e
res=text_between(t,s,e)
Call o 'Text: "'t'"'
Say ' text between' "'"s"'" 'and' "'"e"'" 'is' "'"res"'"
Call o 'Start delimiter: "'s'"'
Call o 'End delimiter: "'e'"'
Call o 'Output: "'res'"'
Call o ''
Return
 
text_between: Procedure
Parse Arg this_text, start_text, end_text
If start_text='<start>' Then
rest=this_text
Else Do
Line 583 ⟶ 2,821:
rest=substr(this_text,s+length(start_text))
Else
Return this_text''
End
If end_text='<end>' Then
Return rest
Else Do
e=pos(end_text,rest)
If e=0 Then
Return this_textrest
Return left(rest,e-1)
End</lang>
 
o: Say arg(1) </syntaxhighlight>
{{out|Output}}
<pre>UsingText: the string '"Hello Rosetta Code world':"
Start delimiter: "Hello "
text between 'Hello ' and ' world' is 'Rosetta Code'
End delimiter: " world"
text between '<start>' and ' world' is 'Hello Rosetta Code'
Output: "Rosetta Code"
text between 'Hello' and '<end>' is ' Rosetta Code world'
 
text between 'Hello Rosetta ' and 'Code world' is ''
Text: text between '"Hello Rosetta' and 'Code world' is ' '"
Start delimiter: "start"
text between 'Code' and 'Hello' is 'Hello Rosetta Code world'
End delimiter: " world"
text between 'Hello Rosetta Code' and 'Code world' is 'Hello Rosetta Code world'
Output: text between 'Goodbye' and 'Code world' is '"Hello Rosetta Code world'</pre> "
 
Text: "Hello Rosetta Code world"
Start delimiter: "Hello "
End delimiter: "end"
Output: "Rosetta Code world"
 
Text: "</div><div style="chinese">???</div>"
Start delimiter: "<div style="chinese">"
End delimiter: "</div>"
Output: "???"
 
Text: "<text>Hello <span>Rosetta Code</span> world</text><table style="myTable">"
Start delimiter: "<text>"
End delimiter: "<table>"
Output: "Hello <span>Rosetta Code</span> world</text><table style="myTable">"
 
Text: "<table style="myTable"><tr><td>hello world</td></tr></table>"
Start delimiter: "<table>"
End delimiter: "</table>"
Output: ""
 
Text: "The quick brown fox jumps over the lazy other fox"
Start delimiter: "quick "
End delimiter: " fox"
Output: "brown"
 
Text: "One fish two fish red fish blue fish"
Start delimiter: "fish "
End delimiter: " red"
Output: "two fish"
 
Text: "FooBarBazFooBuxQuux"
Start delimiter: "Foo"
End delimiter: "Foo"
Output: "BarBaz"</pre>
 
===version 2===
This REXX version makes use of the REXX &nbsp; '''parse''' &nbsp; instruction to extract the required string.
 
Also, it wasn't necessary, but I <u>assummed</u> (bad assumption?) that the &nbsp; <big>'''\'''</big> &nbsp; could be an escape character, but unless clarified,
<br>it's being treated as a commom character, &nbsp; REXX has no need for escape characters (within character strings).
<syntaxhighlight lang="rexx">/*REXX programs displays the text between two text deliminiters in a target text string.*/
call TB 'Hello Rosetta Code world', "Hello ", ' world'
call TB 'Hello Rosetta Code world', "start", ' world'
call TB 'Hello Rosetta Code world', "Hello", 'end'
call TB '</div><div style=\"chinese\">???</div>', '<div style=\"chinese\">', "</div>"
call TB '<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">',"<text>",'<table>'
call TB '<table style=\"myTable\"><tr><td>hello world</td></tr></table>',"<table>",'</table>'
call TB 'The quick brown fox jumps over the lazy other fox', "quick ", ' fox'
call TB 'One fish two fish red fish blue fish', "fish ", ' red'
call TB 'FooBarBazFooBuxQuux', "Foo", 'Foo'
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
TB: procedure: parse arg T,S,E; say /*obtain text, start delim, end delim. */
say ' Text: "'T'"' /*echo the text to terminal. */
say 'Start delimiter: "'S'"' /* " " start delim " " */
say 'End delimiter: "'E'"' /* " " end " " " */
$=T; if S\=='start' then parse var T (S) $ /*extract stuff after the START delim*/
if E\=='end' then parse var $ $ (E) /* " " before " END. " */
say ' Output: "'$'"' /*display the extracted string to term.*/
return</syntaxhighlight>
{{out|output}}
<pre>
Text: "Hello Rosetta Code world"
Start delimiter: "Hello "
End delimiter: " world"
Output: "Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start delimiter: "start"
End delimiter: " world"
Output: "Hello Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start delimiter: "Hello"
End delimiter: "end"
Output: " Rosetta Code world"
 
Text: "</div><div style=\"chinese\">???</div>"
Start delimiter: "<div style=\"chinese\">"
End delimiter: "</div>"
Output: "???"
 
Text: "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
Start delimiter: "<text>"
End delimiter: "<table>"
Output: "Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
 
Text: "<table style=\"myTable\"><tr><td>hello world</td></tr></table>"
Start delimiter: "<table>"
End delimiter: "</table>"
Output: ""
 
Text: "The quick brown fox jumps over the lazy other fox"
Start delimiter: "quick "
End delimiter: " fox"
Output: "brown"
 
Text: "One fish two fish red fish blue fish"
Start delimiter: "fish "
End delimiter: " red"
Output: "two fish"
 
Text: "FooBarBazFooBuxQuux"
Start delimiter: "Foo"
End delimiter: "Foo"
Output: "BarBaz"
</pre>
 
=={{header|Ring}}==
<syntaxhighlight lang="ring">
# Project : Text between
 
text = "Hello Rosetta Code world"
startdelimiter = "Hello"
enddelimiter = "world"
textdel = []
 
see "Example 1. Both delimiters set :" + nl
see 'Text = "Hello Rosetta Code world"' + nl
see 'Start delimiter = "Hello"' + nl
see 'End delimiter = "world"'+ nl
see "Output = "
textarr = str2list(substr(text , " ", nl))
posstart = find(textarr, startdelimiter)
posend = find(textarr, enddelimiter)
for n = posstart + 1 to posend - 1
add(textdel, textarr[n])
next
see '"' + substr(list2str(textdel), nl, " ") +'"' + nl + nl
 
see "Example 2. Start delimiter is the start of the string :" + nl
see 'Text = "Hello Rosetta Code world"' + nl
see 'Start delimiter = "start"' + nl
see 'End delimiter = "world"'+ nl
see "Output = "
textdel = []
textarr = str2list(substr(text , " ", nl))
posend = find(textarr, enddelimiter)
for n = 1 to posend - 1
add(textdel, textarr[n])
next
see '"' + substr(list2str(textdel), nl, " ") +'"' + nl + nl
 
see "Example 3. End delimiter is the end of the string :" + nl
see 'Text = "Hello Rosetta Code world"' + nl
see 'Start delimiter = "Hello"' + nl
see 'End delimiter = "end"'+ nl
see "Output = "
textdel = []
textarr = str2list(substr(text , " ", nl))
posstart = find(textarr, startdelimiter)
for n = posstart + 1 to len(textarr)
add(textdel, textarr[n])
next
see '"' + substr(list2str(textdel), nl, " ") +'"' + nl + nl
</syntaxhighlight>
Output:
<pre>
Example 1. Both delimiters set :
Text = "Hello Rosetta Code world"
Start delimiter = "Hello"
End delimiter = "world"
Output = "Rosetta Code"
 
Example 2. Start delimiter is the start of the string :
Text = "Hello Rosetta Code world"
Start delimiter = "start"
End delimiter = "world"
Output = "Hello Rosetta Code"
 
Example 3. End delimiter is the end of the string :
Text = "Hello Rosetta Code world"
Start delimiter = "Hello"
End delimiter = "end"
Output = "Rosetta Code world"
</pre>
 
=={{header|RPL}}==
{{works with|HP|48G}}
« → start end
« '''CASE'''
start "start" == '''THEN''' 1 '''END'''
DUP start POS '''THEN''' LASTARG start SIZE + '''END'''
DUP SIZE 1 +
'''END'''
OVER SIZE SUB
1 OVER end POS 1 -
'''IF''' DUP 0 < end "end" == OR '''THEN''' DROP OVER SIZE '''END'''
SUB
» » '<span style="color:blue">BTWN</span>' STO <span style="color:grey">''@ ( "text" "start" "end" -- "text_between" )''</span>
 
=={{header|Ruby}}==
Test
<langsyntaxhighlight lang="ruby">
class String
def textBetween startDelimiter, endDelimiter
Line 652 ⟶ 3,083:
 
puts returnText
</syntaxhighlight>
</lang>
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">
//Use Into<String> so input can be String, &str or anything else that implements Into<String>
fn text_between<S: Into<String>>(input: S, start: S, end: S) -> String {
//Convert to strings
let search_str = input.into();
let start_str = start.into();
let end_str = end.into();
 
let start_idx = if start_str.as_str() == "start" {
0
} else {
let start_point = search_str.find(start_str.as_str());
if start_point.is_none() {
return String::from("");
}
start_point.unwrap() + start_str.len()
};
let remaining = &search_str[start_idx..];
 
let end_idx = if end_str.as_str() == "end" {
remaining.len()
} else {
remaining.find(end_str.as_str()).unwrap_or(remaining.len())
};
 
return remaining[..end_idx].to_string()
}
 
fn main() {
println!("'{}'", text_between("Hello Rosetta Code world", "Hello ", " world"));
println!("'{}'", text_between("Hello Rosetta Code world", "start", " world"));
println!("'{}'", text_between("Hello Rosetta Code world", "Hello", "end"));
println!("'{}'", text_between("</div><div style=\"chinese\">你好嗎</div>", "<div style=\"chinese\">", "</div>"));
println!("'{}'", text_between("<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">", "<text>", "<table>"));
println!("'{}'", text_between("<table style=\"myTable\"><tr><td>hello world</td></tr></table>", "<table>", "</table>"));
println!("'{}'", text_between("The quick brown fox jumps over the lazy other fox", "quick ", " fox"));
println!("'{}'", text_between("One fish two fish red fish blue fish", "fish ", " red"));
println!("'{}'", text_between("FooBarBazFooBuxQuux", "Foo", "Foo"));
}
</syntaxhighlight>
{{out}}
<pre>
'Rosetta Code'
'Hello Rosetta Code'
' Rosetta Code world'
'你好嗎'
'Hello <span>Rosetta Code</span> world</text><table style="myTable">'
''
'brown'
'two fish'
'BarBaz'
</pre>
 
=={{header|Scala}}==
<syntaxhighlight lang="scala">object TextBetween extends App {
val (thisText, startDelimiter, endDelimiter) = (args(0), args(1),args(2))
 
/*
* textBetween: Get the text between two delimiters
*/
private def textBetween(thisText: String, startString: String, endString: String): String = {
var startIndex = 0
var endIndex = 0
if (startString != "start")
{
startIndex = thisText.indexOf(startString)
if (startIndex < 0) return ""
else startIndex = startIndex + startString.length
}
if (endString == "end") endIndex = thisText.length
else {
endIndex = thisText.indexOf(endString)
if (endIndex <= 0) return ""
}
 
thisText.substring(startIndex, endIndex)
} // end method textBetween
 
println(textBetween(thisText, startDelimiter, endDelimiter))
 
}</syntaxhighlight>
 
=={{header|Sidef}}==
Uses /^/ and /$/ as start and end delimiters. Additionally, the start and end delimiters can be regular expressions.
{{trans|Raku}}
<syntaxhighlight lang="ruby">func text_between (text, beg, end) {
 
beg.escape! if beg.kind_of(String)
end.escape! if end.kind_of(String)
 
Regex("#{beg}(.*?)(?:#{end}|\\z)", 's').match(text)[0] \\ ""
}
 
var tests = [
Hash(
text => "Hello Rosetta Code world",
start => "Hello ",
end => " world",
out => "Rosetta Code",
),
Hash(
text => "Hello Rosetta Code world",
start => /^/,
end => " world",
out => "Hello Rosetta Code",
),
Hash(
text => "Hello Rosetta Code world",
start => "Hello ",
end => /$/,
out => "Rosetta Code world",
),
Hash(
text => "</div><div style=\"chinese\">你好嗎</div>",
start => "<div style=\"chinese\">",
end => "</div>",
out => "你好嗎",
),
Hash(
text => "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">",
start => "<text>",
end => "<table>",
out => "Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">",
),
Hash(
text => "<table style=\"myTable\"><tr><td>hello world</td></tr></table>",
start => "<table>",
end => "</table>",
out => "",
),
Hash(
text => "The quick brown fox jumps over the lazy other fox",
start => "quick ",
end => " fox",
out => "brown",
),
Hash(
text => "One fish two fish red fish blue fish",
start => "fish ",
end => " red",
out => "two fish",
),
Hash(
text => "FooBarBazFooBuxQuux",
start => "Foo",
end => "Foo",
out => "BarBaz",
),
]
 
tests.each { |t|
var r = text_between(t{:text}, t{:start}, t{:end})
assert_eq(t{:out}, r)
say "text_between(#{t{:text}.dump}, #{t{:start}.dump}, #{t{:end}.dump}) = #{r.dump}"
}</syntaxhighlight>
{{out}}<pre>
text_between("Hello Rosetta Code world", "Hello ", " world") = "Rosetta Code"
text_between("Hello Rosetta Code world", /^/, " world") = "Hello Rosetta Code"
text_between("Hello Rosetta Code world", "Hello ", /$/) = "Rosetta Code world"
text_between("</div><div style=\"chinese\">\x{4F60}\x{597D}\x{55CE}</div>", "<div style=\"chinese\">", "</div>") = "\x{4F60}\x{597D}\x{55CE}"
text_between("<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">", "<text>", "<table>") = "Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
text_between("<table style=\"myTable\"><tr><td>hello world</td></tr></table>", "<table>", "</table>") = ""
text_between("The quick brown fox jumps over the lazy other fox", "quick ", " fox") = "brown"
text_between("One fish two fish red fish blue fish", "fish ", " red") = "two fish"
text_between("FooBarBazFooBuxQuux", "Foo", "Foo") = "BarBaz"</pre>
 
=={{header|SNOBOL4}}==
{{works with|SNOBOL4, SPITBOL for Linux}}
<syntaxhighlight lang="snobol4">
* Program: text_between.sbl
* To run: sbl -r text_between.sbl
* Description: Get the text in a string that occurs between
* a start and end delimiter. Programs will be given a search string,
* a start delimiter string, and an end delimiter string. The delimiters
* will not be unset, and will not be the empty string.
* Comment: Tested using the Spitbol for Linux version of SNOBOL4
 
lf = substr(&alphabet,11,1) ;* New line or line feed
 
 
* Function text_between will return the text between start and end delimiters,
* where start can be the word 'start' for the beginning of the text,
* and end can be the word 'end' for the end of the text.
define('text_between(text,start,end)sb,eb')
:(text_between_end)
text_between
sb = (ident(start,'start') pos(0), breakx(substr(start,1,1)) start)
eb = (ident(end,'end') rem . text_between, (arb . text_between end) | (rem . text_between) )
text ? sb eb
:(return)
text_between_end
 
 
* Read text lines after the END statement
in1
line = input :f(in1end)
line ? break('|') . text '|' break('|') . start '|' rem . end
output = lf 'Text: "' text '"'
output = 'Start: "' start '"'
output = 'End: "' end '"'
text_between = text_between(text,start,end)
output = 'Output: "' text_between '"'
:(in1)
in1end
 
END
Hello Rosetta Code world|Hello | world
Hello Rosetta Code world|start| world
Hello Rosetta Code world|Hello |end
</div><div style=\"chinese\">你好嗎</div>|<div style=\"chinese\">|</div>
<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">|<text>|<table>
<table style=\"myTable\"><tr><td>hello world</td></tr></table>|<table>|</table>
The quick brown fox jumps over the lazy other fox|quick | fox
One fish two fish red fish blue fish|fish | red
FooBarBazFooBuxQuux|Foo|Foo
</syntaxhighlight>
{{out}}
<pre>
Text: "Hello Rosetta Code world"
Start: "Hello "
End: " world"
Output: "Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start: "start"
End: " world"
Output: "Hello Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start: "Hello "
End: "end"
Output: "Rosetta Code world"
 
Text: "</div><div style=\"chinese\">你好嗎</div>"
Start: "<div style=\"chinese\">"
End: "</div>"
Output: "你好嗎"
 
Text: "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
Start: "<text>"
End: "<table>"
Output: "Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
 
Text: "<table style=\"myTable\"><tr><td>hello world</td></tr></table>"
Start: "<table>"
End: "</table>"
Output: ""
 
Text: "The quick brown fox jumps over the lazy other fox"
Start: "quick "
End: " fox"
Output: "brown"
 
Text: "One fish two fish red fish blue fish"
Start: "fish "
End: " red"
Output: "two fish"
 
Text: "FooBarBazFooBuxQuux"
Start: "Foo"
End: "Foo"
Output: "BarBaz"
</pre>
 
=={{header|Swift}}==
 
<syntaxhighlight lang="swift">import Foundation
 
public extension String {
func textBetween(_ startDelim: String, and endDelim: String) -> String {
precondition(!startDelim.isEmpty && !endDelim.isEmpty)
 
let startIdx: String.Index
let endIdx: String.Index
 
if startDelim == "start" {
startIdx = startIndex
} else if let r = range(of: startDelim) {
startIdx = r.upperBound
} else {
return ""
}
 
if endDelim == "end" {
endIdx = endIndex
} else if let r = self[startIdx...].range(of: endDelim) {
endIdx = r.lowerBound
} else {
endIdx = endIndex
}
 
return String(self[startIdx..<endIdx])
}
}
 
let tests = [
("Hello Rosetta Code world", "Hello ", " world"),
("Hello Rosetta Code world", "start", " world"),
("Hello Rosetta Code world", "Hello ", "end"),
("</div><div style=\"chinese\">你好嗎</div>", "<div style=\"chinese\">", "</div>"),
("<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">", "<text>", "<table>"),
("<table style=\"myTable\"><tr><td>hello world</td></tr></table>", "<table>", "</table>"),
("The quick brown fox jumps over the lazy other fox", "quick ", " fox"),
("One fish two fish red fish blue fish", "fish ", " red"),
("FooBarBazFooBuxQuux", "Foo", "Foo")
]
 
for (input, start, end) in tests {
print("Input: \"\(input)\"")
print("Start delimiter: \"\(start)\"")
print("End delimiter: \"\(end)\"")
print("Text between: \"\(input.textBetween(start, and: end))\"\n")
}</syntaxhighlight>
 
{{out}}
 
<pre style="scroll: overflow; height: 20em">Input: "Hello Rosetta Code world"
Start delimiter: "Hello "
End delimiter: " world"
Text between: "Rosetta Code"
 
Input: "Hello Rosetta Code world"
Start delimiter: "start"
End delimiter: " world"
Text between: "Hello Rosetta Code"
 
Input: "Hello Rosetta Code world"
Start delimiter: "Hello "
End delimiter: "end"
Text between: "Rosetta Code world"
 
Input: "</div><div style="chinese">你好嗎</div>"
Start delimiter: "<div style="chinese">"
End delimiter: "</div>"
Text between: "你好嗎"
 
Input: "<text>Hello <span>Rosetta Code</span> world</text><table style="myTable">"
Start delimiter: "<text>"
End delimiter: "<table>"
Text between: "Hello <span>Rosetta Code</span> world</text><table style="myTable">"
 
Input: "<table style="myTable"><tr><td>hello world</td></tr></table>"
Start delimiter: "<table>"
End delimiter: "</table>"
Text between: ""
 
Input: "The quick brown fox jumps over the lazy other fox"
Start delimiter: "quick "
End delimiter: " fox"
Text between: "brown"
 
Input: "One fish two fish red fish blue fish"
Start delimiter: "fish "
End delimiter: " red"
Text between: "two fish"
 
Input: "FooBarBazFooBuxQuux"
Start delimiter: "Foo"
End delimiter: "Foo"
Text between: "BarBaz"</pre>
 
=={{header|Tcl}}==
 
<syntaxhighlight lang="tcl">package require Tcl 8.5
 
proc between {str start end} {
set f [string first $start $str ]
if {$f < 0} { return "" }
incr f [string length $start]
set e [string first $end $str $f]
return [string range $str $f [expr {($e < 0) ? "end" : $e-1}]]
}
 
## data is taken from "Factor"
set L {
{ "Hello Rosetta Code world" "Hello " " world" }
{ "Hello Rosetta Code world" "start" " world" }
{ "Hello Rosetta Code world" "Hello " "end" }
{ "</div><div style=\"chinese\">你好嗎</div>" "<div style=\"chinese\">" "</div>" }
{ "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">" "<text>" "<table>" }
{ "<table style=\"myTable\"><tr><td>hello world</td></tr></table>" "<table>" "</table>" }
{ "The quick brown fox jumps over the lazy other fox" "quick " " fox" }
{ "One fish two fish red fish blue fish" "fish " " red" }
{ "FooBarBazFooBuxQuux" "Foo" "Foo" }
}
 
foreach x $L {
puts " "
lappend x [between {*}$x]
foreach v $x t { "Text" "Start delimiter" "End delimiter" "Output" } {
puts " [format %15s $t]: $v"
}
}</syntaxhighlight>
 
{{out}}
<pre style="scroll: overflow; height: 20em">
Text: Hello Rosetta Code world
Start delimiter: Hello
End delimiter: world
Output: Rosetta Code
Text: Hello Rosetta Code world
Start delimiter: start
End delimiter: world
Output:
Text: Hello Rosetta Code world
Start delimiter: Hello
End delimiter: end
Output: Rosetta Code world
Text: </div><div style="chinese">你好嗎</div>
Start delimiter: <div style="chinese">
End delimiter: </div>
Output: 你好嗎
Text: <text>Hello <span>Rosetta Code</span> world</text><table style="myTable">
Start delimiter: <text>
End delimiter: <table>
Output: Hello <span>Rosetta Code</span> world</text><table style="myTable">
Text: <table style="myTable"><tr><td>hello world</td></tr></table>
Start delimiter: <table>
End delimiter: </table>
Output:
Text: The quick brown fox jumps over the lazy other fox
Start delimiter: quick
End delimiter: fox
Output: brown
Text: One fish two fish red fish blue fish
Start delimiter: fish
End delimiter: red
Output: two fish
Text: FooBarBazFooBuxQuux
Start delimiter: Foo
End delimiter: Foo
Output: BarBaz
</pre>
 
=={{header|UNIX Shell}}==
Line 663 ⟶ 3,537:
This can be made to work with ksh (93) by removing all uses of the "local" keyword, though this will cause it to modify global variables.
 
The "hard" assertions when unpacking the arguments to the "text_between" function reflect the assumptions in the requirements for this problem: that null/empty arguments will never be provided. If any empty arguments are given, the interpreter running this function will exit after printing an error. If this function is invoked without a subshell, that will crash the invoking program as well. In practical use, that may not be desirable, in which case the ":?" assertions should be replaced with less harsh conditional-unpack code (e.g. <code>if [ -z "${1:-}" ]; then echo "Invalid input!" && return 127; else local var="$1"; fi</code>).
<lang bash>text_between() {
local search="${1:-}"
local start_str="${2:-}"
local end_str="${3:-}"
local index_temp
 
<syntaxhighlight lang="bash">text_between() {
if [ -z "$start_str" ]; then
echo local search="Start${1:?Search text not provided}" >&2
local start_str="${2:?Start text not provided}"
return 1
local end_str="${3:?End text not provided}"
elif [ "$start_str" != "start" ]; then
local temp=
index_temp="${search##*$start_str}"
 
if [ "$index_temp" = "$search" ]; then
if [ "$start_str" != "start" ]; then
echo "Start text not found" >&2
# $temp will be $search with everything before the first occurrence of
return 1
# $start_str (inclusive) removed, searching from the beginning.
temp="${search#*$start_str}"
# If the start delimiter wasn't found, return an empty string.
# Comparing length rather than string equality because character
# comparison is not necessary here.
if [ "${#temp}" -eq "${#search}" ]; then
search=
else
search="$temp"
fi
search="$index_temp"
fi
 
if [ -z "$end_str" = "end" ]; then
echo "End text not provided" >&2
return 1
elif [ "$end_str" = "end" ]; then
echo "$search"
else
# Output will be $search with everything after the last occurrence of
index_temp="${search%%$end_str*}"
# $end_str (inclusive) removed, searching from the end.
# This error condition assumes that if end occurs before start, invocation should fail.
echo "${search%%$end_str*}"
if [ "$index_temp" = "$search" ]; then
echo "End text not found" >&2
return 1
fi
echo "$index_temp"
fi
return 0
}
 
text_between "Hello Rosetta Code world" "Hello " " world"
text_between "Hello Rosetta Code world" "start" " world"
text_between "Hello Rosetta Code world" "Hello " "end"</syntaxhighlight>
 
</lang>
=={{header|VBA}}==
<syntaxhighlight lang="vb">Option Explicit
 
Private Const STRING_START As String = "Start"
Private Const STRING_END As String = "End"
 
Sub Main()
Dim Text As String, First As String, Last As String, Output As String
'Example 1. Both delimiters set
Text = "Hello Rosetta Code world"
First = "Hello "
Last = " world"
Output = "1- " & Text_Between(Text, First, Last) & vbCrLf
'Example 2. Start delimiter is the start of the string
Text = "Hello Rosetta Code world"
First = "Start"
Last = " world"
Output = Output & "2- " & Text_Between(Text, First, Last) & vbCrLf
'Example 3. End delimiter is the end of the string
Text = "Hello Rosetta Code world"
First = "Hello "
Last = "End"
Output = Output & "3- " & Text_Between(Text, First, Last) & vbCrLf
'Example 4. End delimiter appears before and after start delimiter
Text = "</div><div style=\""chinese\"">你好嗎</div>..."
First = "<div style=\""chinese\"">"
Last = "</div>"
Output = Output & "4- " & Text_Between(Text, First, Last) & vbCrLf
'Example 5. End delimiter not present
Text = "<text>Hello <span>Rosetta Code</span> world</text><table style=\""myTable\"">"
First = "<text>"
Last = "<table>"
Output = Output & "5- " & Text_Between(Text, First, Last) & vbCrLf
'Example 6. Start delimiter not present
Text = "<table style=\""myTable\""><tr><td>hello world</td></tr></table>"
First = "<table>"
Last = "</table>"
Output = Output & "6- " & Text_Between(Text, First, Last) & vbCrLf
'Example 7. Multiple instances of end delimiter after start delimiter (match until the first one)
Text = "The quick brown fox jumps over the lazy other fox"
First = "quick "
Last = " fox"
Output = Output & "7- " & Text_Between(Text, First, Last) & vbCrLf
'Example 8. Multiple instances of the start delimiter (start matching at the first one)
Text = "One fish two fish red fish blue fish"
First = "fish "
Last = " red"
Output = Output & "8- " & Text_Between(Text, First, Last) & vbCrLf
'Example 9. Start delimiter is end delimiter
Text = "FooBarBazFooBuxQuux"
First = "Foo"
Last = "Foo"
Output = Output & "9- " & Text_Between(Text, First, Last) & vbCrLf
'Example 10 : End delimiter appears before and NOT after start delimiter
Text = "</div><div style=\""chinese\"">你好嗎..."
First = "<div style=\""chinese\"">"
Last = "</div>"
Output = Output & "10- " & Text_Between(Text, First, Last) & vbCrLf
'Example 11. Text = ""
Text = ""
First = "Start"
Last = "End"
Output = Output & "11- " & Text_Between(Text, First, Last) & vbCrLf
'Example 12. Start and end delimiters use special values
Text = "Hello Rosetta Code world"
First = "Start"
Last = "End"
Output = Output & "12- " & Text_Between(Text, First, Last)
'Result :
Debug.Print Output
End Sub
 
Private Function Text_Between(T$, F$, L$) As String
Dim i As Long
i = InStr(T, L) + 1
Select Case True
Case T = "", F = "", InStr(T, F) = 0 And F <> STRING_START
Text_Between = ""
Case F = STRING_START And L = STRING_END
Text_Between = T
Case F = STRING_START
Text_Between = Mid(T, 1, InStr(T, L) - 1)
Case L = STRING_END, InStr(T, L) = 0, InStr(T, L) < InStr(T, F) And InStr(i, T, L) = 0
Text_Between = Mid(T, Len(F) + InStr(T, F))
Case F = L
Text_Between = Mid(T, Len(F) + InStr(T, F), InStr(i, T, F) - Len(F) - 1)
Case Else
Text_Between = Mid(T, Len(F) + InStr(T, F), InStr(InStr(T, F), T, L) - (Len(F) + InStr(T, F)))
End Select
End Function</syntaxhighlight>
{{out}}
<pre>1- Rosetta Code
2- Hello Rosetta Code
3- Rosetta Code world
4- 你好嗎
5- Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">
6-
7- brown
8- two fish
9- BarBaz
10- 你好嗎...
11-
12- Hello Rosetta Code world</pre>
 
=={{header|Visual Basic}}==
{{works with|Visual Basic|6}}
<syntaxhighlight lang="vb">Public Function TextBetween(ByVal Text As String, ByVal StartDelim As String, ByVal EndDelim As String) As String
Dim indS As Long
Dim indE As Long
If StartDelim = "start" Then
indS = 1
Else
indS = InStr(1, Text, StartDelim)
If indS Then
indS = indS + Len(StartDelim)
End If
End If
If indS Then
If EndDelim = "end" Then
indE = Len(Text) + 1
Else
indE = InStr(indS, Text, EndDelim)
If indE = 0 Then
indE = Len(Text) + 1
End If
End If
indE = indE - indS
If indE Then
TextBetween = Mid$(Text, indS, indE)
End If
End If
End Function
 
' *********************
 
Sub Main()
' tests
Dim Text As String
Dim StartDelim As String
Dim EndDelim As String
Dim Expected As String
 
'Ex. 1
Text = "Hello Rosetta Code world"
StartDelim = "Hello "
EndDelim = " world"
Expected = "Rosetta Code"
Debug.Assert TextBetween(Text, StartDelim, EndDelim) = Expected
 
'Ex. 2
Text = "Hello Rosetta Code world"
StartDelim = "start"
EndDelim = " world"
Expected = "Hello Rosetta Code"
Debug.Assert TextBetween(Text, StartDelim, EndDelim) = Expected
 
'Ex. 3
Text = "Hello Rosetta Code world"
StartDelim = "Hello "
EndDelim = "end"
Expected = "Rosetta Code world"
Debug.Assert TextBetween(Text, StartDelim, EndDelim) = Expected
 
'Ex. 4
Expected = ChrW$(&H4F60) & ChrW$(&H597D) & ChrW$(&H55CE)
Text = "</div><div style=""chinese"">" & Expected & "</div>"
StartDelim = "<div style=""chinese"">"
EndDelim = "</div>"
Debug.Assert TextBetween(Text, StartDelim, EndDelim) = Expected
 
'Ex. 5
Text = "<text>Hello <span>Rosetta Code</span> world</text><table style=""myTable"">"
StartDelim = "<text>"
EndDelim = "<table>"
Expected = "Hello <span>Rosetta Code</span> world</text><table style=""myTable"">"
Debug.Assert TextBetween(Text, StartDelim, EndDelim) = Expected
 
'Ex. 6
Text = "<table style=""myTable""><tr><td>hello world</td></tr></table>"
StartDelim = "<table>"
EndDelim = "</table>"
Expected = ""
Debug.Assert TextBetween(Text, StartDelim, EndDelim) = Expected
 
'Ex. 7
Text = "The quick brown fox jumps over the lazy other fox"
StartDelim = "quick "
EndDelim = " fox"
Expected = "brown"
Debug.Assert TextBetween(Text, StartDelim, EndDelim) = Expected
 
'Ex. 8
Text = "One fish two fish red fish blue fish"
StartDelim = "fish "
EndDelim = " red"
Expected = "two fish"
Debug.Assert TextBetween(Text, StartDelim, EndDelim) = Expected
 
'Ex. 9
Text = "FooBarBazFooBuxQuux"
StartDelim = "Foo"
EndDelim = "Foo"
Expected = "BarBaz"
Debug.Assert TextBetween(Text, StartDelim, EndDelim) = Expected
 
'Extra test: empty text between delimiters
StartDelim = "Foo"
EndDelim = "BarBaz"
Expected = ""
Text = StartDelim & Expected & EndDelim & "FooBuxQuux"
Debug.Assert TextBetween(Text, StartDelim, EndDelim) = Expected
End Sub</syntaxhighlight>
 
=={{header|Visual Basic .NET}}==
{{trans|C#}}
<syntaxhighlight lang="vbnet">Module Module1
Function TextBetween(source As String, pre As String, suf As String) As String
Dim startIndex As Integer
 
If pre = "start" Then
startIndex = 0
Else
startIndex = source.IndexOf(pre)
If startIndex < 0 Then
Return ""
End If
startIndex += pre.Length
End If
 
Dim endIndex = source.IndexOf(suf, startIndex)
If endIndex < 0 OrElse suf = "end" Then
Return source.Substring(startIndex)
End If
Return source.Substring(startIndex, endIndex - startIndex)
End Function
 
Sub Print(s As String, b As String, e As String)
Console.WriteLine("text: '{0}'", s)
Console.WriteLine("start: '{0}'", b)
Console.WriteLine("end: '{0}'", e)
Console.WriteLine("result: '{0}'", TextBetween(s, b, e))
Console.WriteLine()
End Sub
 
Sub Main()
Console.OutputEncoding = System.Text.Encoding.UTF8
 
Print("Hello Rosetta Code world", "Hello ", " world")
Print("Hello Rosetta Code world", "start", " world")
Print("Hello Rosetta Code world", "Hello ", "end")
Print("</div><div style=""chinese"">你好嗎</div>", "<div style=""chinese"">", "</div>")
Print("<text>Hello <span>Rosetta Code</span> world</text><table style=""myTable"">", "<text>", "<table>")
Print("<table style=""myTable""><tr><td>hello world</td></tr></table>", "<table>", "</table>")
Print("The quick brown fox jumps over the lazy other fox", "quick ", " fox")
Print("One fish two fish red fish blue fish", "fish ", " red")
Print("FooBarBazFooBuxQuux", "Foo", "Foo")
End Sub
 
End Module</syntaxhighlight>
{{out}}
<pre>text: 'Hello Rosetta Code world'
start: 'Hello '
end: ' world'
result: 'Rosetta Code'
 
text: 'Hello Rosetta Code world'
start: 'start'
end: ' world'
result: 'Hello Rosetta Code'
 
text: 'Hello Rosetta Code world'
start: 'Hello '
end: 'end'
result: 'Rosetta Code world'
 
text: '</div><div style="chinese">你好嗎</div>'
start: '<div style="chinese">'
end: '</div>'
result: '你好嗎'
 
text: '<text>Hello <span>Rosetta Code</span> world</text><table style="myTable">'
start: '<text>'
end: '<table>'
result: 'Hello <span>Rosetta Code</span> world</text><table style="myTable">'
 
text: '<table style="myTable"><tr><td>hello world</td></tr></table>'
start: '<table>'
end: '</table>'
result: ''
 
text: 'The quick brown fox jumps over the lazy other fox'
start: 'quick '
end: ' fox'
result: 'brown'
 
text: 'One fish two fish red fish blue fish'
start: 'fish '
end: ' red'
result: 'two fish'
 
text: 'FooBarBazFooBuxQuux'
start: 'Foo'
end: 'Foo'
result: 'BarBaz'</pre>
 
=={{header|V (Vlang)}}==
{{trans|Go}}
<syntaxhighlight lang="v (vlang)">fn text_between(str string, start string, end string) string {
if str == "" || start == "" || end == "" {
return str
}
mut s := 0
if start != "start" {
s = str.index(start) or {-1}
}
if s == -1 {
return ""
}
mut si := 0
if start != "start" {
si = s + start.len
}
mut e := str.len
if end != "end" {
e = str[si..].index(end) or {-1}
if e == -1 {
return str[si..]
}
e += si
}
return str[si..e]
}
fn main() {
texts := [
"Hello Rosetta Code world",
"Hello Rosetta Code world",
"Hello Rosetta Code world",
"</div><div style=\"chinese\">你好嗎</div>",
"<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">",
"<table style=\"myTable\"><tr><td>hello world</td></tr></table>",
"The quick brown fox jumps over the lazy other fox",
"One fish two fish red fish blue fish",
"FooBarBazFooBuxQuux",
]
starts:= [
"Hello ", "start", "Hello ", "<div style=\"chinese\">",
"<text>", "<table>", "quick ", "fish ", "Foo",
]
ends := [
" world", " world", "end", "</div>", "<table>",
"</table>", " fox", " red", "Foo",
]
for i, text in texts {
println("Text: \"$text\"")
println("Start delimiter: \"${starts[i]}\"")
println("End delimiter: \"${ends[i]}\"")
b := text_between(text, starts[i], ends[i])
println("Output: \"$b\"\n")
}
}</syntaxhighlight>
 
{{out}}
<pre>
Text: "Hello Rosetta Code world"
Start delimiter: "Hello "
End delimiter: " world"
Output: "Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start delimiter: "start"
End delimiter: " world"
Output: "Hello Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start delimiter: "Hello "
End delimiter: "end"
Output: "Rosetta Code world"
 
Text: "</div><div style="chinese">你好嗎</div>"
Start delimiter: "<div style="chinese">"
End delimiter: "</div>"
Output: "你好嗎"
 
Text: "<text>Hello <span>Rosetta Code</span> world</text><table style="myTable">"
Start delimiter: "<text>"
End delimiter: "<table>"
Output: "Hello <span>Rosetta Code</span> world</text><table style="myTable">"
 
Text: "<table style="myTable"><tr><td>hello world</td></tr></table>"
Start delimiter: "<table>"
End delimiter: "</table>"
Output: ""
 
Text: "The quick brown fox jumps over the lazy other fox"
Start delimiter: "quick "
End delimiter: " fox"
Output: "brown"
 
Text: "One fish two fish red fish blue fish"
Start delimiter: "fish "
End delimiter: " red"
Output: "two fish"
 
Text: "FooBarBazFooBuxQuux"
Start delimiter: "Foo"
End delimiter: "Foo"
Output: "BarBaz"
</pre>
 
=={{header|Wren}}==
{{trans|Kotlin}}
{{libheader|Wren-fmt}}
<syntaxhighlight lang="wren">import "./fmt" for Fmt
 
var textBetween = Fn.new { |str, start, end|
if (!((start is String) && start != "") && !((end is String) && end != "")) {
Fiber.abort("Start and end must both be non-empty strings.")
}
if (str == "") return str
var s = (start == "start") ? 0 : str.indexOf(start)
if (s == -1) return ""
var si = (start == "start") ? 0 : s + start.count
var e = (end == "end") ? str.count : str.indexOf(end, si)
if (e == -1) return str[si..-1]
return str[si...e]
}
 
var texts = [
"Hello Rosetta Code world",
"Hello Rosetta Code world",
"Hello Rosetta Code world",
"</div><div style=\"chinese\">你好嗎</div>",
"<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">",
"<table style=\"myTable\"><tr><td>hello world</td></tr></table>",
"The quick brown fox jumps over the lazy other fox",
"One fish two fish red fish blue fish",
"FooBarBazFooBuxQuux"
]
 
var starts = [
"Hello ", "start", "Hello ", "<div style=\"chinese\">",
"<text>", "<table>", "quick ", "fish ", "Foo"
]
 
var ends = [
" world", " world", "end", "</div>", "<table>",
"</table>", " fox", " red", "Foo"
]
 
var i = 0
for (text in texts) {
Fmt.print("Text: $q", text)
Fmt.print("Start delimiter: $q", starts[i])
Fmt.print("End delimiter: $q", ends[i])
var b = textBetween.call(text, starts[i], ends[i])
Fmt.print("Output: $q\n", b)
i = i + 1
}</syntaxhighlight>
 
{{out}}
<pre>
Text: "Hello Rosetta Code world"
Start delimiter: "Hello "
End delimiter: " world"
Output: "Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start delimiter: "start"
End delimiter: " world"
Output: "Hello Rosetta Code"
 
Text: "Hello Rosetta Code world"
Start delimiter: "Hello "
End delimiter: "end"
Output: "Rosetta Code world"
 
Text: "</div><div style="chinese">你好嗎</div>"
Start delimiter: "<div style="chinese">"
End delimiter: "</div>"
Output: "你好嗎"
 
Text: "<text>Hello <span>Rosetta Code</span> world</text><table style="myTable">"
Start delimiter: "<text>"
End delimiter: "<table>"
Output: "Hello <span>Rosetta Code</span> world</text><table style="myTable">"
 
Text: "<table style="myTable"><tr><td>hello world</td></tr></table>"
Start delimiter: "<table>"
End delimiter: "</table>"
Output: ""
 
Text: "The quick brown fox jumps over the lazy other fox"
Start delimiter: "quick "
End delimiter: " fox"
Output: "brown"
 
Text: "One fish two fish red fish blue fish"
Start delimiter: "fish "
End delimiter: " red"
Output: "two fish"
 
Text: "FooBarBazFooBuxQuux"
Start delimiter: "Foo"
End delimiter: "Foo"
Output: "BarBaz"
</pre>
 
=={{header|XPL0}}==
<syntaxhighlight lang "XPL0">include xpllib; \for StrFind, StrLen, Print
 
proc TextBetween(Str, StartStr, EndStr);
char Str, StartStr, EndStr;
int EndInx, I, Addr;
[if StrFind(StartStr, "start") = 0 then \another delimiter is given
[Addr:= StrFind(Str, StartStr);
if Addr # 0 then \if delimiter found then
Str:= Addr + StrLen(StartStr) \ start output string after it
else Str:= Str + StrLen(Str);
];
EndInx:= StrLen(Str) - 1;
if StrFind(EndStr, "end") = 0 then \another delimiter is given
[Addr:= StrFind(Str, EndStr);
if Addr # 0 then \if delimiter found then
EndInx:= Addr - Str - 1; \ end output string before it
];
ChOut(0, ^");
for I:= 0 to EndInx do
ChOut(0, Str(I));
ChOut(0, ^"); CrLf(0);
];
 
int Texts, Starts, Ends, I;
[Texts:= [
"Hello Rosetta Code world",
"Hello Rosetta Code world",
"Hello Rosetta Code world",
"</div><div style=^"chinese^">你好嗎</div>",
"<text>Hello <span>Rosetta Code</span> world</text><table style=^"myTable^">",
"<table style=^"myTable^"><tr><td>hello world</td></tr></table>",
"The quick brown fox jumps over the lazy other fox",
"One fish two fish red fish blue fish",
"FooBarBazFooBuxQuux"];
Starts:= [
"Hello ", "start", "Hello ", "<div style=^"chinese^">",
"<text>", "<table>", "quick ", "fish ", "Foo"];
Ends:= [
" world", " world", "end", "</div>",
"<table>", "</table>", " fox", " red", "Foo"];
for I:= 0 to 9-1 do
[Print("Example %d: ", I+1);
TextBetween(Texts(I), Starts(I), Ends(I));
];
]</syntaxhighlight>
{{out}}
<pre>
Example 1: "Rosetta Code"
Example 2: "Hello Rosetta Code"
Example 3: "Rosetta Code world"
Example 4: "你好嗎"
Example 5: "Hello <span>Rosetta Code</span> world</text><table style="myTable">"
Example 6: ""
Example 7: "brown"
Example 8: "two fish"
Example 9: "BarBaz"
</pre>
 
=={{header|Yabasic}}==
{{trans|Wren}}
<syntaxhighlight lang="yabasic">// Rosetta Code problem: http://rosettacode.org/wiki/Text_between
// by Galileo, 04/2022
 
sub textBetween$(string$, start$, end$)
local s, si, e, ls
if start$ = "" and end$ = "" return "Start and end must both be non-empty strings."
if (string$ == "") return string$
if start$ = "start" then s = 1 else s = instr(string$, start$) end if
if s = 0 return ""
if start$ = "start" then si = 1 else si = s + len(start$) end if
ls = len(string$)
if end$ = "end" then e = ls + 1 else e = instr(string$, end$, si) end if
if e = 0 return right$(string$, ls - si + 1)
return mid$(string$, si, e - si)
end sub
data "Hello Rosetta Code world", "Hello", "world"
data "Hello Rosetta Code world", "start", "world"
data "Hello Rosetta Code world", "Hello", "end"
data "</div><div style=\"chinese\">???</div>", "<div style=\"chinese\">", "</div>"
data "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">", "<text>", "<table>"
data "<table style=\"myTable\"><tr><td>hello world</td></tr></table>", "<table>", "</table>"
data "The quick brown fox jumps over the lazy other fox", "quick ", " fox"
data "One fish two fish red fish blue fish", "fish ", " red"
data "FooBarBazFooBuxQuux", "Foo", "Foo"
data ""
do
read text$
if text$ = "" break
print "Text: ", text$
read start$
print "Start delimiter: ", start$
read end$
print "End delimiter: ", end$
print "Output: ", textBetween$(text$, start$, end$), "\n"
loop</syntaxhighlight>
{{out}}
<pre>Text: Hello Rosetta Code world
Start delimiter: Hello
End delimiter: world
Output: Rosetta Code
 
Text: Hello Rosetta Code world
Start delimiter: start
End delimiter: world
Output: Hello Rosetta Code
 
Text: Hello Rosetta Code world
Start delimiter: Hello
End delimiter: end
Output: Rosetta Code world
 
Text: </div><div style="chinese">???</div>
Start delimiter: <div style="chinese">
End delimiter: </div>
Output: ???
 
Text: <text>Hello <span>Rosetta Code</span> world</text><table style="myTable">
Start delimiter: <text>
End delimiter: <table>
Output: Hello <span>Rosetta Code</span> world</text><table style="myTable">
 
Text: <table style="myTable"><tr><td>hello world</td></tr></table>
Start delimiter: <table>
End delimiter: </table>
Output:
 
Text: The quick brown fox jumps over the lazy other fox
Start delimiter: quick
End delimiter: fox
Output: brown
 
Text: One fish two fish red fish blue fish
Start delimiter: fish
End delimiter: red
Output: two fish
 
Text: FooBarBazFooBuxQuux
Start delimiter: Foo
End delimiter: Foo
Output: BarBaz
 
---Program done, press RETURN---</pre>
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">fcn getText(text,start,end){
s = (if((s:=text.find(start))==Void) 0 else s + start.len());
e = (if((e:=text.find(end,s))==Void) text.len() else e);
Line 710 ⟶ 4,239:
getText("Hello Rosetta Code world","Hello "," world").println();
getText("Hello Rosetta Code world","start", " world").println();
getText("Hello Rosetta Code world","Hello", "end" ).println();</langsyntaxhighlight>
{{out}}
<pre>
2,083

edits