Re: a conflicting StringReplace
- To: mathgroup at smc.vnet.net
- Subject: [mg56363] Re: [mg56306] a conflicting StringReplace
- From: Hui Fang <fangh73 at xmu.edu.cn>
- Date: Fri, 22 Apr 2005 06:25:12 -0400 (EDT)
- Organization: Xiamen University Photonics Center
- References: <4FDA877403669E48A2CB7F1122A7948045C785@dassne02.da.gei>
- Reply-to: fangh73 at xmu.edu.cn
- Sender: owner-wri-mathgroup at wolfram.com
Thanks, Wolf. Your experiment is very convincing.
Hui
Wolf, Hartmut wrote:
>The behavior is explained in Help:
>
>StringReplace goes through a string, testing substrings that start at
>each successive character position. On each substring, it tries in turn
>each of the transformation rules you have specified. If any of the rules
>apply, it replaces the substring, then continues to go through the
>string, starting at the character position after the end of the
>substring.
>
>
>What is not quite clear (to me) from that explanation is the meaning of
>"each substring": does this just mean the rest of the string starting at
>current position, or is each substring of different length (starting
>there) considered as different (such that the next rule is tried first,
>before we further run down the string? An experiment shows, that the
>first assumtion applies (and this gives the algorithm that performs
>better)
>
>
>StringReplace goes through a string, testing substrings that start at
>each successive character position.
>
>-- starting at position of "a" in string "abc"
>
>
>On each substring,
>
>-- at starting position it's: "abc"
>
>it [StringReplace] tries in turn each of the transformation rules you
>have specified.
>
>-- so first it tries "b" of "bc" on "a" of "abc" --> fail, try next rule
>-- then tries "a" of "ab" on "a" of "abc" --> interesting, go on
>-- tries "b" of "ab" on "b" of "abc" --> interesting, go on
>-- pattern is exhausted, such we have --> success of pattern on
>substring "ab" of "abc"
>
>If any of the rules apply, it replaces the substring,
>
>-- so here "ab" of "abc" becomes "AB", i.e the string becomes
>
>"ABc"
>
>then continues to go through the string, starting at the character
>position after the end of the substring.
>
>-- Substring considered next is "c" of "abc" (or "ABc", replaced part is
>not considered again)
>
>-- so now we compare "b" of "bc" on "c" --> fail, try next rule
>-- try "a" of "ab" on "c" --> fail, no more rule, advance position
>
>-- but string is exhausted
>
>-- so the result is "ABc"
>
>
>
>
>Here are two more examples:
>
>
>In[29]:= StringReplace["abc", {"ab" -> "ab", "bc" -> "bc",
> "a" -> "1", "b" -> "2", "c" -> "3"}]
>Out[29]= "ab3"
>
>here rule "a" -> "1" is masked by pattern "ab" which matches first,
>"bc" and "b" cannot match, as neither substring "bc" nor "b" are part of
>substring "c" left over from "abc" after substitution "ab" -> "ab".
>
>
>
>In[31]:= StringReplace["abc", {"a" -> "1", "ab" -> "ab",
> "bc" -> "bc", "b" -> "2", "c" -> "3"}]
>Out[31]= "1bc"
>
>here rule "a" -> "1" matches first, and substitution takes place.
>For rest of string "bc", from "abc", patterns "a" and "ab" will never
>match, "bc" -> "bc" matches first,
>and such masks rule "c" -> "3"
>
>
>
>
>--
>Hartmut Wolf
>
>
>
>