String Manipulation

Frits van Bommel fvbommel at REMwOVExCAPSs.nl
Tue Jul 10 07:24:07 PDT 2007


[fixed upside-down reply]
okibi wrote:
> okibi Wrote:
> 
>> I have a question for you all.
>>
>> If I have the following string or char[], how would I get the xsl filename out of it?
>>
>> char[] myStr = "...<?xml-stylesheet type=\"text/xsl\" href=\"example.xsl\"?>...";
>>
>> Is there a way to get it to return just example.xsl?
>>
> Well, I ended up just doing some splits to get what the location of the xsl file will be. Still, I'd like someone to tell me if there is an easier way.

Did you try regexes (regular expressions)? (see 
http://www.digitalmars.com/d/1.0/phobos/std_regexp.html)

(I see Gilles G. has already suggested regexes since I started this 
post, but I'll post it anyway since I think my suggested regex is better 
:) )

For example:
---
import std.regexp;
import std.stdio;

void main() {
     char[] myStr = "...<?xml-stylesheet type=\"text/xsl\" 
href=\"example.xsl\"?>...";

     if (auto m = search(myStr, `<\?.*href="(.*)".*\?>`)) {
         writefln("Match: '%s'", m.match(1));
     } else {
         writefln("No match found.");
     }
}
---
(Correct for linewrapping before use)
This picks out the text between (double) quotes after 'href=' in a 
'<?'-'?>' block. You'll need to be a bit more tricky if you want to 
handle single quotes as well (or is that a HTML-only thing?). Perhaps 
`<\?.*href=(["'])(.*)\1.*\?>`: The part between the first parentheses 
captures the opening quote after 'href=', the \1 says to match the same 
quote there. The .xsl file name is then m.match(2), since m.match(1) is 
now the opening quote.

By the way: note the use of a backquoted string (``s) to avoid escaping 
the '\'s and '"'s, otherwise the original regexp would be 
"<\\?.*href=\"(.*)\".*\\?>" which is equivalent but uglier (IMHO). You 
could also use this for your XML string to avoid '\"' all over the place.

Also notice the quoting of '?' as '\?' since '?' is a special character 
in regexes.


More information about the Digitalmars-d-learn mailing list