Strip comments from a string: Difference between revisions

m
syntax highlighting fixup automation
m (→‎{{header|J}}: make output match expression generating output)
m (syntax highlighting fixup automation)
Line 31:
 
=={{header|11l}}==
<langsyntaxhighlight lang="11l">F remove_comments(line, sep)
V? p = line.find(sep)
I p != N
Line 39:
print(remove_comments(‘apples ; pears # and bananas’, (‘;’, ‘#’)))
print(remove_comments(‘apples ; pears # and bananas’, ‘#’))
print(remove_comments(‘apples ; pears # and bananas’, ‘!’))</langsyntaxhighlight>
 
{{out}}
Line 49:
 
=={{header|68000 Assembly}}==
<langsyntaxhighlight lang="68000devpac">StripComments:
;prints a string but stops at the comment character
;INPUT: D7 = comment character(s) of choice
Line 109:
 
TestString:
dc.b "apples ; pears # and bananas",0</langsyntaxhighlight>
 
=={{header|Action!}}==
<langsyntaxhighlight Actionlang="action!">PROC Strip(CHAR ARRAY text,chars,result)
BYTE i,j,pos,found
 
Line 152:
Test(" ",";")
Test("","#")
RETURN</langsyntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Strip_comments_from_a_string.png Screenshot from Atari 8-bit computer]
Line 174:
 
=={{header|Ada}}==
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO;
procedure Program is
Comment_Characters : String := "#;";
Line 193:
end;
end loop;
end Program;</langsyntaxhighlight>
 
=={{header|Aime}}==
<langsyntaxhighlight lang="aime">strip_comments(data b)
{
b.size(b.look(0, ";#")).bf_drop(" \t").bb_drop(" \t");
Line 208:
 
0;
}</langsyntaxhighlight>
 
=={{header|ALGOL 68}}==
Line 214:
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny].}}
{{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d]}}
<langsyntaxhighlight lang="algol68">#!/usr/local/bin/a68g --script #
 
PROC trim comment = (STRING line, CHAR marker)STRING:(
Line 239:
grep in string(re marker, line, index, NIL);
print((q, line[:index-1], q, new line))
END CO</langsyntaxhighlight>
Output:
<pre>
Line 251:
=={{header|ALGOL W}}==
Leading and trailing spaces are removed from the result, as per the March 29 2011 task version.
<langsyntaxhighlight lang="algolw">begin
% determines the non-comment portion of the string s, startPos and endPos are %
% returned set to the beginning and ending character positions (indexed from 0) %
Line 293:
testStripComments( " apples, pears" )
end
end.</langsyntaxhighlight>
{{out}}
<pre>
Line 303:
 
=={{header|Applesoft BASIC}}==
<langsyntaxhighlight ApplesoftBasiclang="applesoftbasic">10 LET C$ = ";#"
20 S$(1)="APPLES, PEARS # AND BANANAS"
30 S$(2)="APPLES, PEARS ; AND BANANAS"
Line 328:
250 IF A$ = " " THEN NEXT I
260 LET S$ = MID$(S$, 1, I)
270 RETURN</langsyntaxhighlight>
 
=={{header|Arturo}}==
 
<langsyntaxhighlight lang="rebol">stripComments: function [str][
strip replace str {/[#;].+/} ""
]
Line 338:
loop ["apples, pears # and bananas", "apples, pears ; and bananas"] 'str [
print [str "->" stripComments str]
]</langsyntaxhighlight>
 
{{out}}
Line 346:
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">Delims := "#;"
str := "apples, pears # and bananas"
str2:= "apples, pears, `; and bananas" ; needed to escape the ; since that is AHK's comment marker
Line 364:
}
return String1
}</langsyntaxhighlight>
Output:
<pre>
Line 373:
=={{header|AutoIt}}==
It was always said in discussion, the task is not really stripping comments. It's only a truncation.
<syntaxhighlight lang="autoit">
<lang AutoIt>
Dim $Line1 = "apples, pears # and bananas"
Dim $Line2 = "apples, pears ; and bananas"
Line 391:
Next
EndFunc ;==>_StripAtMarker
</syntaxhighlight>
</lang>
Output:
<pre>
Line 405:
That means: the comment starts with the first semicolon outside a string.
 
<syntaxhighlight lang="autoit">
<lang AutoIt>
Dim $aLines[4] = _
[ _
Line 462:
Next
EndFunc ;==>_LineStripComment
</syntaxhighlight>
</lang>
Output:
<pre>
Line 488:
=={{header|AWK}}==
 
<langsyntaxhighlight AWKlang="awk">#!/usr/local/bin/awk -f
{
sub("[ \t]*[#;].*$","",$0);
print;
}</langsyntaxhighlight>
 
=={{header|ANSI BASIC}}==
<langsyntaxhighlight lang="ansibasic">100 DECLARE EXTERNAL FUNCTION FNstripcomment$
110 LET marker$="#;"
120 PRINT """";FNstripcomment$("apples, pears # and bananas", marker$);""""
Line 508:
210 NEXT I
220 LET FNstripcomment$=RTRIM$(text$)
230 END FUNCTION</langsyntaxhighlight>
Output:
<pre>
Line 517:
=={{header|BQN}}==
<code>StripW</code> only removes spaces. <code>StripC</code> uses that in conjunction with a filter that removes comments.
<langsyntaxhighlight lang="bqn">StripW←((∨`∧∨`⌾⌽)' '⊸≠)⊸/
StripC←StripW (¬·∨`∊⟜"#;")⊸/
 
•Show StripC " apples, pears # and bananas "
•Show StripC " apples, pears ; and bananas"</langsyntaxhighlight>
<syntaxhighlight lang="text">"apples, pears"
"apples, pears"</langsyntaxhighlight>
 
=={{header|Bracmat}}==
<langsyntaxhighlight lang="bracmat">( " apples, pears # and bananas
oranges, mangos ; and a durian"
: ?text
Line 546:
& !newText \n cleanUp$!text:?newText
& out$(str$!newText)
);</langsyntaxhighlight>
Output:
<pre>
Line 553:
 
=={{header|C}}==
<langsyntaxhighlight Clang="c">#include<stdio.h>
 
int main()
Line 578:
return 0;
}</langsyntaxhighlight>
Output:
<pre>
Line 594:
=={{header|C sharp|C#}}==
 
<langsyntaxhighlight lang="csharp">
using System.Text.RegularExpressions;
 
Line 604:
return Regex.Replace(str, delimiter + ".+", string.Empty).Trim();
}
</syntaxhighlight>
</lang>
Sample output:
<pre>
Line 614:
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">#include <iostream>
#include <string>
 
Line 636:
}
return 0;
}</langsyntaxhighlight>
Sample output:
<pre>
Line 646:
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="clojure">> (apply str (take-while #(not (#{\# \;} %)) "apples # comment"))
"apples "</langsyntaxhighlight>
 
=={{header|COBOL}}==
{{works with|GnuCOBOL}}
<langsyntaxhighlight lang="cobol"> identification division.
program-id. StripComments.
 
Line 671:
unstring line-text delimited by "#" or ";" into line-text
display quote, function trim(line-text), quote
.</langsyntaxhighlight>
{{out}}
<pre>"apples, pears"
Line 677:
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">(defun strip-comments (s cs)
"Truncate s at the first occurrence of a character in cs."
(defun comment-char-p (c)
(some #'(lambda (x) (char= x c)) cs))
(let ((pos (position-if #'comment-char-p s)))
(subseq s 0 pos)))</langsyntaxhighlight>
 
{{Out}}
Line 697:
 
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.stdio, std.regex;
 
string remove1LineComment(in string s, in string pat=";#") {
Line 709:
 
writeln(s, "\n====>\n", s.remove1LineComment());
}</langsyntaxhighlight>
{{out}}
<pre>apples, pears # and bananas
Line 718:
 
=={{header|Delphi}}==
<langsyntaxhighlight Delphilang="delphi">program StripComments;
 
{$APPTYPE CONSOLE}
Line 735:
Writeln('apples, pears ; and bananas --> ' + DoStripComments('apples, pears ; and bananas',';'));
Readln;
end.</langsyntaxhighlight>
 
=={{header|DWScript}}==
<langsyntaxhighlight lang="delphi">function StripComments(s : String) : String;
begin
var p := FindDelimiter('#;', s);
Line 747:
 
PrintLn(StripComments('apples, pears # and bananas'));
PrintLn(StripComments('apples, pears ; and bananas'));</langsyntaxhighlight>
 
=={{header|Erlang}}==
<syntaxhighlight lang="erlang">
<lang Erlang>
-module( strip_comments_from_string ).
 
Line 767:
not_comment( $; ) -> false;
not_comment( _ ) -> true.
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 777:
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">let stripComments s =
s
|> Seq.takeWhile (fun c -> c <> '#' && c <> ';')
|> Seq.map System.Char.ToString
|> Seq.fold (+) ""</langsyntaxhighlight>
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">USE: sequences.extras
: strip-comments ( str -- str' )
[ "#;" member? not ] take-while "" like ;</langsyntaxhighlight>
 
=={{header|Fantom}}==
Using a regular expression:
<langsyntaxhighlight lang="fantom">class Main
{
static Str removeComment (Str str)
Line 808:
echo (removeComment ("String with comment ; here"))
}
}</langsyntaxhighlight>
 
=={{header|Forth}}==
Line 845:
 
: COMMENT-STRIP ( addr len -- addr 'len) -LEADING -COMMENT -TRAILING ;
</langsyntaxhighlight>Tested at the Forth console
<pre>S" apples, pears # and bananas" COMMENT-STRIP TYPE apples, pears ok
S" apples, pears ; and bananas" COMMENT-STRIP TYPE apples, pears ok</pre>
 
=={{header|Fortran}}==
<langsyntaxhighlight lang="fortran">!****************************************************
module string_routines
!****************************************************
Line 893:
!****************************************************
end program main
!****************************************************</langsyntaxhighlight>
output:
<pre>
Line 901:
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Sub stripComment(s As String, commentMarkers As String)
Line 927:
Print
Print "Press any key to quit"
Sleep</langsyntaxhighlight>
 
{{out}}
Line 938:
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 964:
fmt.Printf("stripped: %q\n", stripComment(s))
}
}</langsyntaxhighlight>
Output:
<pre>
Line 976:
 
=={{header|Groovy}}==
<langsyntaxhighlight lang="groovy">def stripComments = { it.replaceAll(/\s*[#;].*$/, '') }</langsyntaxhighlight>
Testing:
<langsyntaxhighlight lang="groovy">assert 'apples, pears' == stripComments('apples, pears # and bananas')
assert 'apples, pears' == stripComments('apples, pears ; and bananas')</langsyntaxhighlight>
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">ms = ";#"
 
main = getContents >>=
mapM_ (putStrLn . takeWhile (`notElem` ms)) . lines</langsyntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight Iconlang="icon"># strip_comments:
# return part of string up to first character in 'markers',
# or else the whole string if no comment marker is present
Line 999:
write (strip_comments ("apples, pears # and bananas", cset ("#;")))
write (strip_comments ("apples, pears ; and bananas", cset ("#;")))
end</langsyntaxhighlight>
 
Output:
Line 1,009:
 
=={{header|Inform 7}}==
<langsyntaxhighlight lang="inform7">Home is a room.
 
When play begins:
Line 1,019:
say "[T] -> ";
replace the regular expression "<#;>.*$" in T with "";
say "[T][line break]".</langsyntaxhighlight>
 
Since square brackets have a special meaning in strings, Inform's regular expression syntax uses angle brackets for character grouping.
 
=={{header|J}}==
'''Solution 1''' (mask & filter): <langsyntaxhighlight lang="j">strip=: dltb@(#~ *./\@:-.@e.&';#')</langsyntaxhighlight>
'''Solution 2''' (index & cut): <langsyntaxhighlight lang="j">strip=: dltb@({.~ <./@i.&';#')</langsyntaxhighlight>
 
'''Example''':<langsyntaxhighlight lang="j"> dquote strip ' apples, pears # and bananas' NB. quote result to show stripped whitespace
"apples, pears"
strip ' apples, pears ; and bananas'
apples, pears</langsyntaxhighlight>
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">import java.io.*;
 
public class StripLineComments{
Line 1,055:
}
}
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
===ES5===
<langsyntaxhighlight lang="javascript">function stripComments(s) {
var re1 = /^\s+|\s+$/g; // Strip leading and trailing spaces
var re2 = /\s*[#;].+$/g; // Strip everything after # or ; to the end of the line, including preceding spaces
Line 1,070:
 
alert(stripComments(s1) + '\n' + stripComments(s2));
</syntaxhighlight>
</lang>
 
A more efficient version that caches the regular expressions in a closure:
 
<langsyntaxhighlight lang="javascript">var stripComments = (function () {
var re1 = /^\s+|\s+$/g;
var re2 = /\s*[#;].+$/g;
Line 1,081:
};
}());
</syntaxhighlight>
</lang>
A difference with the two versions is that in the first, all declarations are processed before code is executed so the function declaration can be after the code that calls it. However in the second example, the expression creating the function must be executed before the function is available, so it must be before the code that calls it.
 
===ES6===
<langsyntaxhighlight lang="javascript">(() => {
'use strict';
 
Line 1,146:
// MAIN ---
return main();
})();</langsyntaxhighlight>
{{Out}}
<pre>apples, pears
Line 1,153:
=={{header|jq}}==
If your version of jq has regex support, the task can be accomplished with the following one-liner:
<langsyntaxhighlight lang="jq">sub("[#;].*";"") | sub("^\\s+";"") | sub("\\s+$";"")</langsyntaxhighlight>
 
Otherwise, we can define strip_comment as a jq filter, as follows. For clarity, the helper functions are presented as top-level functions.
 
<langsyntaxhighlight lang="jq"># define whitespace here as a tab, space, newline, return or form-feed character:
def is_whitespace: . as $in | " \n\r\f\t" | index($in);
 
Line 1,176:
end ) as $ix
| if $ix then .[0:$ix] else . end
| trim;</langsyntaxhighlight>
 
'''Example''':
<langsyntaxhighlight lang="jq">" abc ; def # ghi" | strip_comment</langsyntaxhighlight>
{{out}}
 
<langsyntaxhighlight lang="sh">"abc"</langsyntaxhighlight>
 
=={{header|Julia}}==
<tt>striplinecomment</tt> is designed to be flexible and robust. By default <tt>#</tt> and <tt>;</tt> are considered comment defining characters, but any characters can be used by passing them as the string <tt>cchars</tt>. All such characters are escaped in the regular expression used to eliminate comments to allow characters special to the Regex language (e.g. <tt>^</tt>, <tt>$</tt>, <tt>[</tt>) to be used as a comment character.
<syntaxhighlight lang="julia">
<lang Julia>
using Printf
 
Line 1,209:
println(" \"", s, "\"")
end
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,233:
 
It then removes whitespace from the beginning and end of the resulting string:
<langsyntaxhighlight lang="scala">// version 1.0.6
 
val r = Regex("""(/\*.*\*/|//.*$)""")
Line 1,247:
)
for (string in strings) println(stripComments(string))
}</langsyntaxhighlight>
 
{{out}}
Line 1,258:
 
=={{header|Liberty BASIC}}==
<langsyntaxhighlight lang="lb">string1$ = "apples, pears # and bananas"
string2$ = "pears;, " + chr$(34) + "apples ; " + chr$(34) + " an;d bananas"
commentMarker$ = "; #"
Line 1,273:
next i
parse$ = Left$(string$, (i - 1))
End Function</langsyntaxhighlight>
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">comment_symbols = ";#"
 
s1 = "apples, pears # and bananas"
Line 1,282:
 
print ( string.match( s1, "[^"..comment_symbols.."]+" ) )
print ( string.match( s2, "[^"..comment_symbols.."]+" ) )</langsyntaxhighlight>
 
=={{header|Maple}}==
<langsyntaxhighlight Maplelang="maple">> use StringTools in map( Trim@Take, [ "\t\t apples, pears \t# and bananas", " apples, pears ; and bananas \t" ], "#;" ) end;
["apples, pears", "apples, pears"]</langsyntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">a = "apples, pears # and bananas
apples, pears ; and bananas";
b = StringReplace[a, RegularExpression["[ ]+[#;].+[\n]"] -> "\n"];
StringReplace[b, RegularExpression["[ ]+[#;].+$"] -> ""] // FullForm</langsyntaxhighlight>
{{out}}
<pre>"apples, pears\napples, pears"</pre>
 
=={{header|MATLAB}} / {{header|Octave}}==
<langsyntaxhighlight Matlablang="matlab">function line = stripcomment(line)
e = min([find(line=='#',1),find(line==';',1)]);
if ~isempty(e)
Line 1,305:
end;
end;
</syntaxhighlight>
</lang>
Output:
<pre>>> stripcomment('apples, pears # and bananas\n')
Line 1,313:
 
=={{header|MiniScript}}==
<langsyntaxhighlight MiniScriptlang="miniscript">strip = function(test)
comment = test.indexOf("#")
if comment == null then comment = test.indexOf(";")
Line 1,326:
print strip("This is a semicolon test ; a comment") + "."
print strip("This is a no comment test ") + "."
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,335:
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">import strutils
proc removeComments(line: string; sep: char): string =
Line 1,347:
echo "Stripped: “$#”" % Str1.removeComments('#')
echo "Original: “$#”" % Str2
echo "Stripped: “$#”" % Str2.removeComments(';')</langsyntaxhighlight>
 
{{out}}
Line 1,356:
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">use System.IO.File;
 
class StripComments {
Line 1,384:
};
}
}</langsyntaxhighlight>
 
=={{header|OCaml}}==
<langsyntaxhighlight lang="ocaml">let strip_comments str =
let len = String.length str in
let rec aux print i =
Line 1,406:
strip_comments "apples, pears # and bananas\n";
strip_comments "apples, pears ; and bananas\n";
;;</langsyntaxhighlight>
 
or with an imperative style:
 
<langsyntaxhighlight lang="ocaml">let strip_comments =
let print = ref true in
String.iter (function
| ';' | '#' -> print := false
| '\n' -> print_char '\n'; print := true
| c -> if !print then print_char c)</langsyntaxhighlight>
 
=={{header|Oforth}}==
 
<langsyntaxhighlight Oforthlang="oforth">: stripComments(s, markers)
| firstMarker |
markers map(#[ s indexOf ]) reduce(#min) ->firstMarker
s firstMarker ifNotNull: [ left(firstMarker 1 - ) ] strip ;</langsyntaxhighlight>
 
{{out}}
Line 1,437:
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">while (<>)
{
s/[#;].*$//s; # remove comment
Line 1,443:
s/\s+$//; # remove trailing whitespace
print
}</langsyntaxhighlight>
 
=={{header|Phix}}==
Added a couple of things that can go wrong with something nowhere near sufficiently smart or for that matter language-specific enough.<br>
A line comment inside a block comment (eg " /* left -- right */") could also be very dodgy, and perhaps vice versa.
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">strip_comments</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">sequence</span> <span style="color: #000000;">comments</span><span style="color: #0000FF;">={</span><span style="color: #008000;">"#"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">";"</span><span style="color: #0000FF;">})</span>
Line 1,467:
<span style="color: #0000FF;">?</span><span style="color: #000000;">strip_comments</span><span style="color: #0000FF;">(</span><span style="color: #008000;">" WS_CAPTION = #00C00000, -- = WS_BORDER+WS_DLGFRAME"</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"--"</span><span style="color: #0000FF;">})</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">strip_comments</span><span style="color: #0000FF;">(</span><span style="color: #008000;">" title = \"--Title--\""</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"--"</span><span style="color: #0000FF;">})</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 1,479:
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(for Str '("apples, pears # and bananas" "apples, pears ; and bananas")
(prinl (car (split (chop Str) "#" ";"))) )</langsyntaxhighlight>
Output:
<pre>
Line 1,488:
 
=={{header|PL/I}}==
<langsyntaxhighlight PLlang="pl/Ii">k = search(text, '#;');
if k = 0 then put skip list (text);
else put skip list (substr(text, 1, k-1));</langsyntaxhighlight>
 
=={{header|Prolog}}==
{{works with|SWI Prolog}}
This version is implemented as a state automata to strip multiple lines of comments.
<langsyntaxhighlight lang="prolog">stripcomment(A,B) :- stripcomment(A,B,a).
stripcomment([A|AL],[A|BL],a) :- \+ A=0';, \+ A=0'# , \+ A=10, \+ A=13 , stripcomment(AL,BL,a).
stripcomment([A|AL], BL ,a) :- ( A=0';; A=0'#), \+ A=10, \+ A=13 , stripcomment(AL,BL,b).
Line 1,505:
apples, pears # and bananas",
stripcomment(In,Out),
format("~s~n",[Out]).</langsyntaxhighlight>
Output:
<pre>
Line 1,513:
</pre>
This version uses prolog's pattern matching with two append/3 to strip 1 line.
<langsyntaxhighlight lang="prolog">strip_1comment(A,D) :- ((S1=0'#;S1=0';),append(B,[S1|C],A)), \+ ((S2=0'#;S2=0';),append(_X,[S2|_Y],B)) -> B=D; A=D.</langsyntaxhighlight>
At the query console:
<pre>
Line 1,525:
 
=={{header|PureBasic}}==
<langsyntaxhighlight PureBasiclang="purebasic">Procedure.s Strip_comments(Str$)
Protected result$=Str$, l, l1, l2
l1 =FindString(Str$,"#",1)
Line 1,541:
EndIf
ProcedureReturn result$
EndProcedure</langsyntaxhighlight>
Implementation
<langsyntaxhighlight PureBasiclang="purebasic">#instring1 ="apples, pears # and bananas"
#instring2 ="apples, pears ; and bananas"
 
PrintN(Strip_comments(#instring1))
PrintN(Strip_comments(#instring2))</langsyntaxhighlight>
Output:<pre>
apples, pears
Line 1,555:
=={{header|Python}}==
===Procedural===
<langsyntaxhighlight lang="python">def remove_comments(line, sep):
for s in sep:
i = line.find(s)
Line 1,565:
print remove_comments('apples ; pears # and bananas', ';#')
print remove_comments('apples ; pears # and bananas', '!')
</syntaxhighlight>
</lang>
 
===Regular expressions===
You could also use a regular expression
<langsyntaxhighlight lang="python">import re
 
m = re.match(r'^([^#]*)#(.*)$', line)
if m: # The line contains a hash / comment
line = m.group(1)
</syntaxhighlight>
</lang>
 
===Functional===
Line 1,581:
which is defined over strings as well as lists.
{{Works with|Python|3.7}}
<langsyntaxhighlight lang="python">'''Comments stripped with itertools.takewhile'''
 
from itertools import takewhile
Line 1,609:
'''
)
)</langsyntaxhighlight>
{{Out}}
<pre>apples, pears
Line 1,617:
This is most cleanly accomplished using the <code>stringr</code> package.
 
<langsyntaxhighlight lang="r">strip_comments <- function(str)
{
if(!require(stringr)) stop("you need to install the stringr package")
str_trim(str_split_fixed(str, "#|;", 2)[, 1])
}</langsyntaxhighlight>
 
Example usage:
 
<langsyntaxhighlight lang="r">x <-c(
"apples, pears # and bananas", # the requested hash test
"apples, pears ; and bananas", # the requested semicolon test
Line 1,631:
" apples, pears # and bananas" # with preceding spaces
)
strip_comments(x)</langsyntaxhighlight>
 
=={{header|Racket}}==
 
<syntaxhighlight lang="racket">
<lang Racket>
#lang at-exp racket
 
Line 1,656:
 
(strip-comments2 text) ; -> "apples, pears\napples, pears"
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku" perl6line>$*IN.slurp.subst(/ \h* <[ # ; ]> \N* /, '', :g).print</langsyntaxhighlight>
 
=={{header|Red}}==
Red has an embedded parse engine called Parse.
For more info on the Parse dialect. http://www.red-lang.org/2013/11/041-introducing-parse.html.
<syntaxhighlight lang="red">
<lang Red>
>> parse s: "apples, pears ; and bananas" [to [any space ";"] remove thru end]
== true
>> s
== "apples, pears"
</syntaxhighlight>
</lang>
 
But you can also use simple series operations to find where something occurs, clear from that position, and trim leading and trailing spaces.
<syntaxhighlight lang="red">
<lang Red>
s: "apples, pears ; and bananas"
dlms: charset "#;"
Line 1,684:
trim head clear find s dlms
== "apples, pears"
</syntaxhighlight>
</lang>
 
=={{header|REXX}}==
Line 1,695:
<br>The fourth subroutine is similar to the third version but more idiomatic.
<br><br>All four subroutines trim leading &nbsp; ''and'' &nbsp; trailing blanks after stripping the "comments".
<langsyntaxhighlight lang="rexx">/*REXX program strips a string delineated by a hash (#) or a semicolon (;). */
old1= ' apples, pears # and bananas' ; say ' old ───►'old1"◄───"
new1= stripCom1(old1) ; say ' 1st version new ───►'new1"◄───"
Line 1,735:
if p\==0 then x=left(x,p-1) /*shorten the X string by one character*/
end /*k*/ /* [↑] If p==0, then char wasn't found*/
return strip(x) /*return the stripped shortened string.*/</langsyntaxhighlight>
'''output'''
<pre>
Line 1,752:
 
===version 2===
<langsyntaxhighlight lang="rexx">Call stripd ' apples, pears # and bananas'
Call stripd ' apples, pears and bananas'
Exit
Line 1,765:
Say '>'old'<'
Say '>'new'<'
Return</langsyntaxhighlight>
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
aList = 'apples, pears # and bananas'
see aList + nl
Line 1,782:
if nr > 0 cList = substr(bList,1,nr-1) ok
return cList
</syntaxhighlight>
</lang>
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">class String
def strip_comment( markers = ['#',';'] )
re = Regexp.union( markers ) # construct a regular expression which will match any of the markers
Line 1,803:
p str.strip_comment('and')
p " \t \n ;".strip_comment
p "".strip_comment</langsyntaxhighlight>
{{out}}
<pre>
Line 1,815:
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">fn strip_comment<'a>(input: &'a str, markers: &[char]) -> &'a str {
input
.find(markers)
Line 1,827:
println!("{:?}", strip_comment("apples, pears ; and bananas", &['#', ';']));
println!("{:?}", strip_comment("apples, pears and bananas ", &['#', ';']));
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,836:
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">object StripComments {
def stripComments1(s:String, markers:String =";#")=s takeWhile (!markers.contains(_)) trim
Line 1,858:
print("apples, pears ; and bananas")
}
}</langsyntaxhighlight>
Output:
<pre>'apples, pears # and bananas' =>
Line 1,869:
=={{header|Scheme}}==
{{works with|Guile}}
<langsyntaxhighlight lang="scheme">(use-modules (ice-9 regex))
 
(define (strip-comments s)
Line 1,876:
 
(display (strip-comments "apples, pears # and bananas"))(newline)
(display (strip-comments "apples, pears ; and bananas"))(newline)</langsyntaxhighlight>
Output:<pre>apples, pears
apples, pears</pre>
 
=={{header|sed}}==
<langsyntaxhighlight lang="bash">#!/bin/sh
# Strip comments
echo "$1" | sed 's/ *[#;].*$//g' | sed 's/^ *//'</langsyntaxhighlight>
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
 
const func string: stripComment (in string: line) is func
Line 1,916:
writeln(stripComment(line));
end for;
end func;</langsyntaxhighlight>
 
Output:
Line 1,928:
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func strip_comment(s) {
(s - %r'[#;].*').strip;
}
Line 1,936:
" apples, pears "].each { |s|
say strip_comment(s).dump;
};</langsyntaxhighlight>
{{out}}
<pre>
Line 1,946:
=={{header|Standard ML}}==
Strips comments and trailing spaces.
<langsyntaxhighlight lang="sml">val stripComment =
let
val notMarker = fn #"#" => false | #";" => false | _ => true
Line 1,952:
in
string o dropr Char.isSpace o takel notMarker o full
end</langsyntaxhighlight>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">proc stripLineComments {inputString {commentChars ";#"}} {
# Switch the RE engine into line-respecting mode instead of the default whole-string mode
regsub -all -line "\[$commentChars\].*$" $inputString "" commentStripped
# Now strip the whitespace
regsub -all -line {^[ \t\r]*(.*\S)?[ \t\r]*$} $commentStripped {\1}
}</langsyntaxhighlight>
Demonstration:
<langsyntaxhighlight lang="tcl"># Multi-line string constant
set input "apples, pears # and bananas
apples, pears ; and bananas"
# Do the stripping
puts [stripLineComments $input]</langsyntaxhighlight>
Output:
<pre>
Line 1,973:
</pre>
The above code has one issue though; it's notion of a set of characters is very much that of the RE engine. That's possibly desirable, but to handle ''any'' sequence of characters as a set of separators requires a bit more cleverness.
<langsyntaxhighlight lang="tcl">proc stripLineComments {inputString {commentChars ";#"}} {
# Convert the character set into a transformation
foreach c [split $commentChars ""] {lappend map $c "\uFFFF"}; # *very* rare character!
Line 1,980:
# Now strip the whitespace
regsub -all -line {^[ \t\r]*(.*\S)?[ \t\r]*$} $commentStripped {\1}
}</langsyntaxhighlight>
Output in the example is the same as above.
 
=={{header|TUSCRIPT}}==
<langsyntaxhighlight lang="tuscript">$$ MODE TUSCRIPT
strngcomment=*
DATA apples, pears # and bananas
Line 1,994:
x=SPLIT (s,comment_char,string,comment)
PRINT string
ENDLOOP</langsyntaxhighlight>
Output:
<pre>
Line 2,005:
{{works with|pdksh}}
Adapted from the Advanced Bash-Scripting Guide, section 10.1 [http://tldp.org/LDP/abs/html/string-manipulation.html Manipulating Strings].
<langsyntaxhighlight lang="bash">bash$ a='apples, pears ; and bananas'
bash$ b='apples, pears # and bananas'
bash$ echo ${a%%;*}
Line 2,011:
bash$ echo ${b%%#*}
apples, pears
bash$</langsyntaxhighlight>
 
=={{header|VBScript}}==
<syntaxhighlight lang="vb">
<lang vb>
Function strip_comments(s,char)
If InStr(1,s,char) > 0 Then
Line 2,026:
WScript.StdOut.WriteLine strip_comments("apples, pears # and bananas","#")
WScript.StdOut.WriteLine strip_comments("apples, pears ; and bananas",";")
</syntaxhighlight>
</lang>
 
=={{header|Vlang}}==
<langsyntaxhighlight lang="vlang">const comment_chars = "#;"
 
fn main() {
Line 2,048:
}
return source
}</langsyntaxhighlight>
 
{{out}}
Line 2,062:
=={{header|Wren}}==
This is based on what the post 29th March, 2011 requirements appear to be.
<langsyntaxhighlight lang="ecmascript">var markers = ["#", ";"]
 
var stripComments = Fn.new { |s|
Line 2,081:
var t = stripComments.call(s)
System.print("'%(s)' -> '%(t)'")
}</langsyntaxhighlight>
 
{{out}}
Line 2,092:
=={{header|XProfan}}==
Delimiter in string "#" or ";" will be ignored. Good for INI files.
<langsyntaxhighlight lang="xprofan">
Proc Min
Declare int PC, i, float e, t
Line 2,178:
 
waitkey
end</langsyntaxhighlight>
Output:
<pre>
Line 2,188:
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">fcn strip(text,c){ // if c in text, remove it and following text
if (Void!=(n:=text.find(c))) text=text[0,n];
text.strip() // remove leading and trailing white space
Line 2,195:
foreach c in (vm.arglist[1,*]){ text=strip(text,c) }
text
}</langsyntaxhighlight>
Or, if you want the all-in-one stripper:
<langsyntaxhighlight lang="zkl">fcn stripper(text,a,b,c,etc){
vm.arglist[1,*].reduce('wrap(text,c){
if (Void!=(n:=text.find(c))) text[0,n] else text
},text)
.strip()
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">String(">", strip(" apples, pears # and bananas","#"), "<").println();
String(">", stripper(" apples, pears ; and # bananas","#",";"), "<").println();</langsyntaxhighlight>
{{out}}
<pre>
10,333

edits