30-May-2013 10:49, Timothee Cour пишет:
ok, here it is:

https://github.com/timotheecour/dtools/blob/master/dtools/util/util.d#L78
simplified implementation and added missing escape symbols. Any symbol
missing?
I was basing myself based on http://dlang.org/phobos/std_regex.html,
table entry '\c where c is one of', but that was incomplete. I'm also
noting that table entry 'any character except' is also incomplete.

One thing missing that '.' that should become '\.'.


 > Technically any working "escapeRegex" would also function as a valid
"escapeRegexReplace", although it might be slightly faster to have a
specialised one.

not sure, because they escape differently (\$ vs $$).

shall i do a pull request for std.regex?

Yes, please. It's was a blind spot for long time. Strictly speaking I think that a generic escaping routine would work:

auto escape(S1, S2, C)(S1 src, S2 escapables, C escape='\\')
        if(isSomeString!S1 && isSomeString!S2 && isSomeChar!C)
{
        ....
}

Do we have something like this in std.string?
Then all we need is a convenience wrapper in std.regex?

BTW unescape is as important.


On Wed, May 29, 2013 at 8:32 PM, Diggory <digg...@googlemail.com
<mailto:digg...@googlemail.com>> wrote:

    On Wednesday, 29 May 2013 at 23:33:30 UTC, timotheecour wrote:

        something like this, which we should have in std.regex:

        string escapeRegex(string a){
                 import std.string;
                 enum transTable = ['[' : `\[`, '|' : `\|`, '*': `\*`,
        '+': `\+`, '?': `\?`, '(': `\(`, ')': `\)`];
                 return translate(a, transTable);
        }
        string escapeRegexReplace(string a){
                 import std.string;
        //      enum transTable = ['$' : `$$`, '\\' : `\\`];
                 enum transTable = ['$' : `$$`];
                 return translate(a, transTable);
        }

        unittest{
                 string a=`asdf(def[ghi]+*|)`;
                 assert(match(a,regex(__escapeRegex(a))).hit==a);
                 string b=`$aa\/$ $$#@$\0$1#$@%#@%=+_`;
                 auto
        s=replace(a,regex(escapeRegex(__a)),escapeRegexReplace(b));
                 assert(s==b);
        }


    That would be good (although you missed a few :P)

    Technically any working "escapeRegex" would also function as a valid
    "escapeRegexReplace", although it might be slightly faster to have a
    specialised one.




--
Dmitry Olshansky

Reply via email to