[Newbies] [on] how to match partial regexes? how to match and
delete string prefixes?
oscar.nierstrasz at gmail.com
Sat Mar 28 19:30:23 UTC 2009
Is there a way ask a regex if it matches any part of a string?
matches: wants an exact match, and matchesPrefix: clearly only matches
a prefix. The best I found was to abuse matchesIn: and check the size
of the response, but this is not very clean.
Does anybody know if there is a better way?
| normal re |
re := '[^/]+\/\.\.\/' asRegex.
[ (re matchesIn: normal) notEmpty ] whileTrue: [ normal := re copy:
normal replacingMatchesWith: '' ].
Here I am collapsing ".." navigations within a URL against parent
directories, as long as there is such a match. But
copy:replacingMatchesWith: considers submatches, whereas matches: does
A second question: I would like to strip a string prefix if it
matches. Since this is a literal string, I should not need regexes.
But I cannot find a nice existing method to do this. With regexes I
must escape all special regex chars:
"remove prefix if url is for this website"
self aliasesAsRegexes do: [ :re | (re matchesPrefix: url) ifTrue: [ ^
re copy: url replacingMatchesWith: '' ] ].
This is supposed to delete all known aliases for a given web site from
the start of a url to turn them into local urls.
aliasesAsRegexes ifNil: [
aliasesAsRegexes := aliases collect: [:alias |
alias := '\/' asRegex copy: alias replacingMatchesWith: '\/'.
alias := '\~' asRegex copy: alias replacingMatchesWith: '\~'.
alias := '\:' asRegex copy: alias replacingMatchesWith: '\:'.
alias := '\.' asRegex copy: alias replacingMatchesWith: '\.'.
Bleh! I am ashamed to have to write such crappy code.
The Method Finder did not find me a cool method to do this:
'abra' . 'abracadabra' . 'cadabra'
Thanks for any hints.
More information about the Beginners