I've posted a question about a Find, but not with Replace, and somehow I can't seem to get it to work.
I have a text object, $text, containing a paragraph of text where the first word of each sentence is preceded by a one-or-two digit number, e.g.,
"5The next...". I want to remove all the numbers.
I have a one-line macro I've been using to perform this operation on the actual text of a document that looks like this:
Find and Replace @Text< \d+(\w[[:^punct:]])>, " \\1", 'Esa'
That works fine, although I no longer recall why I doubled the brackets. The thing about punctuation is there because (I think) the text may contain citation references in the form of "T-1.VI.4:1" and I do not want to replace anything in the reference. I've been trying to adapt it to work in the process of a longer macro that copies the text, does some stuff with it, and ends by trying to strip out the digits. In any case, this one-liner does the job I want done.
The code I've been trying to adapt for a text object is this:
$text = $text .findAndReplace " \d+(\w[[:^punct:]])", " \1", 'Esa'
What am I doing wrong? It is returning "()".Huh?
Replacing text in a text object
-
- Posts: 26
- Joined: 2005-10-05 15:05:51
- Location: Portland, OR
- Contact:
Re: Replacing text in a text object
Starting with the solution, you should remove the "$text = " from your line of code.
The reason is the ".findAndReplace" command will perform on your variable, but the returned result will be an (array of) selection(s). Probably in the case you tested, there weren't any hits? Or maybe the fact that the action also deleted the object over which the selections were made caused an empty array?
Anyhow to back up a bit
Works on the current active document
does the same on $textObject.
The first will return a number corresponding to the number of hits, the latter will return a selection object, or an array of selection objects, if you choose the "Find and Replace All" option.
Try
and check the difference.
As for your find expression, it's written to match a string of numbers, followed by a single word character, and then a non-punctuation character. The double brackets are necessary, because otherwise the Find engine treats the single bracket as a set, which would mean it would match any of the characters ":", "^", "p", "u", "n", "c", or "t"
Incidentally note that word characters include numbers, but since search is greedy, the \d+ will be sure to match all the digits and the \w will end up matching only non-digit word characters.
The reason is the ".findAndReplace" command will perform on your variable, but the returned result will be an (array of) selection(s). Probably in the case you tested, there weren't any hits? Or maybe the fact that the action also deleted the object over which the selections were made caused an empty array?
Anyhow to back up a bit
Code: Select all
Find and Replace $findExpr, $replaceExpr, $options
Code: Select all
$textObject.findAndReplace $findExpr, $replaceExpr, $options
The first will return a number corresponding to the number of hits, the latter will return a selection object, or an array of selection objects, if you choose the "Find and Replace All" option.
Try
Code: Select all
$result = Find and Replace $findExpr, $replaceExpr, $options
Code: Select all
$result = $textObject.findAndReplace $findExpr, $replaceExpr, $options
As for your find expression, it's written to match a string of numbers, followed by a single word character, and then a non-punctuation character. The double brackets are necessary, because otherwise the Find engine treats the single bracket as a set, which would mean it would match any of the characters ":", "^", "p", "u", "n", "c", or "t"

Incidentally note that word characters include numbers, but since search is greedy, the \d+ will be sure to match all the digits and the \w will end up matching only non-digit word characters.
philip
Re: Replacing text in a text object
As a test case try:
Code: Select all
$text = "Mississippi"
$result = $text.findAndReplace 'i', '*', 'a'
prompt $text, $result
philip