[squeak-dev] The Inbox: Collections-mt.1018.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Jul 12 13:27:40 UTC 2022


A new version of Collections was added to project The Inbox:
http://source.squeak.org/inbox/Collections-mt.1018.mcz

==================== Summary ====================

Name: Collections-mt.1018
Author: mt
Time: 12 July 2022, 3:27:38.665003 pm
UUID: e638fd0a-45c9-594f-b984-6d5e3ab1d882
Ancestors: Collections-cmm.1017

Propose #match:ignoringCase: akin to #matchesRegexIgnoringCase: but with that other algorithm.

Note that the message #match:ignoreCase: is present in VisualWorks.

=============== Diff against Collections-cmm.1017 ===============

Item was changed:
  ----- Method: String>>match: (in category 'comparing') -----
  match: text
  	"Answer whether text matches the pattern in this string.
  	Matching ignores upper/lower case differences.
  	Where this string contains #, text may contain any character.
  	Where this string contains *, text may contain any sequence of characters."
  
+ 	^ self startingAt: 1 match: text startingAt: 1 ignoringCase: true
- 	^ self startingAt: 1 match: text startingAt: 1
  "
  	'*'			match: 'zort' true
  	'*baz'		match: 'mobaz' true
  	'*baz'		match: 'mobazo' false
  	'*baz*'		match: 'mobazo' true
  	'*baz*'		match: 'mozo' false
  	'foo*'		match: 'foozo' true
  	'foo*'		match: 'bozo' false
  	'foo*baz'	match: 'foo23baz' true
  	'foo*baz'	match: 'foobaz' true
  	'foo*baz'	match: 'foo23bazo' false
  	'foo'		match: 'Foo' true
  	'foo*baz*zort' match: 'foobazort' false
  	'foo*baz*zort' match: 'foobazzort' true
  	'*foo#zort'	match: 'afoo3zortthenfoo3zort' true
  	'*foo*zort'	match: 'afoodezortorfoo3zort' true
  "!

Item was added:
+ ----- Method: String>>match:ignoringCase: (in category 'comparing') -----
+ match: text ignoringCase: aBool
+ 
+ 	^ self startingAt: 1 match: text startingAt: 1 ignoringCase: aBool!

Item was changed:
  ----- Method: String>>startingAt:match:startingAt: (in category 'comparing') -----
  startingAt: keyStart match: text startingAt: textStart
- 	"Answer whether text matches the pattern in this string.
- 	Matching ignores upper/lower case differences.
- 	Where this string contains #, text may contain any character.
- 	Where this string contains *, text may contain any sequence of characters."
- 	
- 	| anyMatch matchStart matchEnd i matchStr j ii jj |
- 	i := keyStart.
- 	j := textStart.
- 	
- 	"Process consecutive *s and #s at the beginning."
- 	anyMatch := false.
- 	[ i <= self size and: [
- 		(self at: i)
- 			caseOf: {
- 				[ $* ] -> [ 
- 					anyMatch := true.
- 					i := i + 1.
- 					true ].
- 				[ $# ] -> [
- 					i := i + 1.
- 					j := j + 1.
- 					true ] }
- 			otherwise: [ false ] ] ] whileTrue.
- 	i > self size ifTrue: [
- 		^j - 1 = text size or: [ "We reached the end by matching the character with a #."
- 			anyMatch and: [ j <= text size ] "Or there was a * before the end." ] ].
- 	matchStart := i.
  
+ 	^ self startingAt: keyStart match: text startingAt: textStart ignoringCase: true!
- 	"Now determine the match string"
- 	matchEnd := self size.
- 	(ii := self indexOf: $* startingAt: matchStart) > 0 ifTrue: [ matchEnd := ii-1 ].
- 	(ii := self indexOf: $# startingAt: matchStart) > 0 ifTrue: [ matchEnd := matchEnd min: ii-1 ].
- 	matchStr := self copyFrom: matchStart to: matchEnd.
- 
- 	"Now look for the match string"
- 	[jj := text findString: matchStr startingAt: j caseSensitive: false.
- 	anyMatch ifTrue: [jj > 0] ifFalse: [jj = j]]
- 		whileTrue:
- 		["Found matchStr at jj.  See if the rest matches..."
- 		(self startingAt: matchEnd+1 match: text startingAt: jj + matchStr size) ifTrue:
- 			[^ true "the rest matches -- success"].
- 		"The rest did not match."
- 		anyMatch ifFalse: [^ false].
- 		"Preceded by * -- try for a later match"
- 		j := j+1].
- 	^ false "Failed to find the match string"!

Item was added:
+ ----- Method: String>>startingAt:match:startingAt:ignoringCase: (in category 'comparing') -----
+ startingAt: keyStart match: text startingAt: textStart ignoringCase: ignoreCase
+ 	"Answer whether text matches the pattern in this string.
+ 	Matching ignores upper/lower case differences if ignoreCase is true.
+ 	Where this string contains #, text may contain any character.
+ 	Where this string contains *, text may contain any sequence of characters."
+ 	
+ 	| anyMatch matchStart matchEnd i matchStr j ii jj |
+ 	i := keyStart.
+ 	j := textStart.
+ 	
+ 	"Process consecutive *s and #s at the beginning."
+ 	anyMatch := false.
+ 	[ i <= self size and: [
+ 		(self at: i)
+ 			caseOf: {
+ 				[ $* ] -> [ 
+ 					anyMatch := true.
+ 					i := i + 1.
+ 					true ].
+ 				[ $# ] -> [
+ 					i := i + 1.
+ 					j := j + 1.
+ 					true ] }
+ 			otherwise: [ false ] ] ] whileTrue.
+ 	i > self size ifTrue: [
+ 		^j - 1 = text size or: [ "We reached the end by matching the character with a #."
+ 			anyMatch and: [ j <= text size ] "Or there was a * before the end." ] ].
+ 	matchStart := i.
+ 
+ 	"Now determine the match string"
+ 	matchEnd := self size.
+ 	(ii := self indexOf: $* startingAt: matchStart) > 0 ifTrue: [ matchEnd := ii-1 ].
+ 	(ii := self indexOf: $# startingAt: matchStart) > 0 ifTrue: [ matchEnd := matchEnd min: ii-1 ].
+ 	matchStr := self copyFrom: matchStart to: matchEnd.
+ 
+ 	"Now look for the match string"
+ 	[jj := text findString: matchStr startingAt: j caseSensitive: ignoreCase not.
+ 	anyMatch ifTrue: [jj > 0] ifFalse: [jj = j]]
+ 		whileTrue:
+ 		["Found matchStr at jj.  See if the rest matches..."
+ 		(self startingAt: matchEnd+1 match: text startingAt: jj + matchStr size ignoringCase: ignoreCase) ifTrue:
+ 			[^ true "the rest matches -- success"].
+ 		"The rest did not match."
+ 		anyMatch ifFalse: [^ false].
+ 		"Preceded by * -- try for a later match"
+ 		j := j+1].
+ 	^ false "Failed to find the match string"!



More information about the Squeak-dev mailing list