String matching: Difference between revisions

From Rosetta Code
Content added Content deleted
(→‎{{header|PureBasic}}: Added PureBasic)
m (→‎{{header|PureBasic}}: Added support for multiple occurrences)
Line 115: Line 115:
</lang>
</lang>
=={{header|PureBasic}}==
=={{header|PureBasic}}==
<lang PureBasic>Procedure StartsWith(String1$, String2$)
<lang PureBasic> Protected Result
If FindString(String1$, String2$, 1) =1 ; E.g Found in position 1
Protected Result
If FindString(String1$, String2$, 1) =1 ; E.g Found in possition 1
Result =CountString(String1$, String2$)
Result =#True
EndIf
EndIf
ProcedureReturn Result
ProcedureReturn Result
Line 126: Line 125:
Protected Result, dl=Len(String1$)-Len(String2$)
Protected Result, dl=Len(String1$)-Len(String2$)
If dl>=0 And Right(String1$, Len(String2$))=String2$
If dl>=0 And Right(String1$, Len(String2$))=String2$
Result =#True
Result =CountString(String1$, String2$)
EndIf
EndIf
ProcedureReturn Result
ProcedureReturn Result
EndProcedure</lang>
EndProcedure</lang>
And a verification
And a verification
<lang PureBasic>Debug StartsWith("Rosettacode", "Rosetta") ; = 1
<lang PureBasic>Debug StartsWith("Rosettacode", "Rosetta") ; = 1
Debug StartsWith("Rosettacode", "code") ; = 0
Debug StartsWith("Rosettacode", "code") ; = 0
Debug StartsWith("eleutherodactylus cruralis", "e") ; = 3
Debug EndsWith ("Rosettacode", "Rosetta") ; = 0
Debug EndsWith ("Rosettacode", "Rosetta") ; = 0
Debug EndsWith ("Rosettacode", "code") ; = 1</lang>
Debug EndsWith ("Rosettacode", "code") ; = 1
Debug EndsWith ("Rosettacode", "e") ; = 2</lang>


=={{header|Python}}==
=={{header|Python}}==

Revision as of 05:35, 16 October 2010

Task
String matching
You are encouraged to solve this task according to the task description, using any language you may know.

Given two strings, demonstrate the following 3 types of matchings:

  1. Determining if the first string starts with second string
  2. Determining if the first string contains the second string at any location
  3. Determining if the first string ends with the second string

Optional requirements: A) Print the location of the match for part 2 B) Handle multiple occurrences of a string for part 2.

ALGOL 68

Translation of: python
Works with: ALGOL 68 version Revision 1 - no extensions to language used
Works with: ALGOL 68G version Any - tested with release 1.18.0-9h.tiny

<lang algol68># define some appropriate OPerators # PRIO STARTSWITH = 5, ENDSWITH = 5; OP STARTSWITH = (STRING str, prefix)BOOL: # assuming LWB = 1 #

 IF UPB str < UPB prefix THEN FALSE ELSE str[:UPB prefix]=prefix FI;

OP ENDSWITH = (STRING str, suffix)BOOL: # assuming LWB = 1 #

 IF UPB str < UPB suffix THEN FALSE ELSE str[UPB str-UPB suffix+1:]=suffix FI;

INT loc, loc2;

print((

 "abcd" STARTSWITH "ab", # returns TRUE #
 "abcd" ENDSWITH "zn", # returns FALSE #
 string in string("bb",loc,"abab"), # returns FALSE #
 string in string("ab",loc,"abab"), # returns TRUE #
 (string in string("bb",loc,"abab")|loc|-1), # returns -1 #
 (string in string("ab",loc,"abab")|loc|-1), # returns +1 #
 (string in string("ab",loc2,"abab"[loc+1:])|loc+loc2|-1) # returns +3 #

))</lang> Output:

TFFT         -1         +1         +3

C++

<lang cpp>

  1. include <string>

using namespace std;

string s1="abcd"; string s2="abab"; string s3="ab"; //Beginning s1.compare(0,s3.size(),s3)!=0; //End s1.compare(s1.size()-s3.size(),s3.size(),s3)!=0; //Anywhere s1.find(s2)//returns string::npos int loc=s2.find(s3)//returns 0 loc=s2.find(s3,loc+1)//returns 2 </lang>

J

<lang j>startswith=: ] -: ({.~ #) contains=: +./@:E.~ endswith=: ] -: ({.~ -@#)</lang>

Example use:

<lang j> 'abcd' startswith 'ab' 1

  'abcd' startswith 'cd'

0

  'abcd' endswith 'ab'

0

  'abcd' endswith 'cd'

1

  'abcd' contains 'bb'

0

  'abcd' contains 'ab'

1

  'abcd' contains 'bc'

1

  'abab' contains 'ab'

1

  'abab' I.@E.~ 'ab'       NB. find starting indicies

0 2</lang>

Note that these verbs also apply to arrays of type other than character so: <lang j> 0 1 2 3 startswith 0 1 NB. integer 1

  4.2 5.1 1.3 9 3 contains 1.3 4.2     NB. floating point

0

  4.2 5.1 1.3 4.2 9 3 contains 1.3 4.2 

1</lang>

Java

<lang java> "abcd".startsWith("ab") //returns true "abcd".endsWith("zn") //returns false "abab".contains("bb") //returns false "abab".contains("ab") //returns true int loc = "abab".indexOf("bb") //returns -1 loc = "abab".indexOf("ab") //returns 0 loc = "abab".indexOf("ab",loc+1) //returns 2 </lang>

Objective-C

<lang objc> [@"abcd" hasPrefix:@"ab"] //returns true [@"abcd" hasSuffix:@"zn"] //returns false int loc = [@"abab" rangeOfString:@"bb"].location //returns -1 loc = [@"abab" rangeOfString:@"ab"].location //returns 0 loc = [@"abab" rangeOfString:@"ab" options:0 range:NSMakeRange(loc+1, [@"abab" length]-(loc+1))].location //returns 2 </lang>

PureBasic

<lang PureBasic> Protected Result

 If FindString(String1$, String2$, 1) =1 ; E.g Found in position 1
   Result =CountString(String1$, String2$)
 EndIf
 ProcedureReturn Result

EndProcedure

Procedure EndsWith(String1$, String2$)

 Protected Result, dl=Len(String1$)-Len(String2$)
 If dl>=0 And Right(String1$, Len(String2$))=String2$
   Result =CountString(String1$, String2$)
 EndIf
 ProcedureReturn Result

EndProcedure</lang> And a verification <lang PureBasic>Debug StartsWith("Rosettacode", "Rosetta")  ; = 1 Debug StartsWith("Rosettacode", "code")  ; = 0 Debug StartsWith("eleutherodactylus cruralis", "e")  ; = 3 Debug EndsWith ("Rosettacode", "Rosetta")  ; = 0 Debug EndsWith ("Rosettacode", "code")  ; = 1 Debug EndsWith ("Rosettacode", "e")  ; = 2</lang>

Python

<lang python> "abcd".startswith("ab") #returns true "abcd".endswith("zn") #returns false "bb" in "abab" #returns false "ab" in "abab" #returns true loc = "abab".find("bb") #returns -1 loc = "abab".find("ab") #returns 0 loc = "abab".find("ab",loc+1) #returns 2 </lang>

Tcl

In this code, we are looking in various ways for the string in the variable needle in the string in the variable haystack. <lang tcl>set isPrefix [string equal -length [string length $needle] $haystack $needle] set isContained [expr {[string first $needle $haystack] >= 0}] set isSuffix [string equal $needle [string range $haystack end-[expr {[string length $needle]-1}] end]]</lang>

Of course, in the cases where the needle is a glob-safe string (i.e., doesn't have any of the characters “*?[” in), this can be written far more conveniently: <lang tcl>set isPrefix [string match $needle* $haystack] set isContained [string match *$needle* $haystack] set isSuffix [string match *$needle $haystack]</lang>