String "dequote" in phobos?

Anonymouse zorael at gmail.com
Thu May 13 17:11:32 UTC 2021


On Thursday, 13 May 2021 at 14:10:08 UTC, cc wrote:
> Does something to dequote (unquote? or what would you call it?) 
> a string exist in the standard library?  I didn't see one in 
> std.string, just wondering before reinventing the wheel.
>
> Something like:
> ```d
> assert(dequote(`"foo"`) == "foo");
> assert(dequote(`'foo'`) == "foo");
> assert(dequote(`"foo's"`) == "foo's");
> assert(dequote(`'foo "bar"'`) == `foo "bar"`);
> assert(dequote(`"fo\"o"`) == `fo"o`);
> dequote(`"fo"o"`); // bad quoting, maybe throw an exception 
> here or something?
> ```

I called mine `unquoted`[1] and `unsinglequoted`. Not very 
imaginative, I concede.

I also assumed ASCII and fearlessly sliced `line[1..$-1]`, which 
you may or may not be able to do.

```d
private T unenclosed(char token = '"', T)(const T line) pure 
nothrow @nogc
if (isSomeString!T)
{
     enum escaped = "\\" ~ token;

     if (line.length < 2)
     {
         return line;
     }
     else if ((line[0] == token) && (line[$-1] == token))
     {
         if ((line.length >= 3) && (line[$-2..$] == escaped))
         {
             // End quote is escaped
             return line;
         }

         return line[1..$-1].unenclosed!token;
     }
     else
     {
         return line;
     }
}


pragma(inline, true)
T unquoted(T)(const T line) pure nothrow @nogc
{
     return unenclosed!'"'(line);
}

unittest
{
     assert(`"Lorem ipsum sit amet"`.unquoted == "Lorem ipsum sit 
amet");
     assert(`"""""Lorem ipsum sit amet"""""`.unquoted == "Lorem 
ipsum sit amet");
     // Unbalanced quotes are left untouched
     assert(`"Lorem ipsum sit amet`.unquoted == `"Lorem ipsum sit 
amet`);
     assert(`"Lorem \"`.unquoted == `"Lorem \"`);
     assert("\"Lorem \\\"".unquoted == "\"Lorem \\\"");
     assert(`"\"`.unquoted == `"\"`);
}


pragma(inline, true)
T unsinglequoted(T)(const T line) pure nothrow @nogc
{
     return unenclosed!'\''(line);
}

// ...
```

I'm not sure it's quite correct for all valid inputs but it 
worked well enough for my purposes.

[1]: http://lu.dpldocs.info/lu.string.unquoted.html


More information about the Digitalmars-d-learn mailing list