开发者

how to generate a string from complex format similiar to regular expression?

开发者 https://www.devze.com 2023-02-14 03:22 出处:网络
We know String.format() can accept format with such style: %[argument_index$][flags][width][.precision]conversion

We know String.format() can accept format with such style: %[argument_index$][flags][width][.precision]conversion which is well known as C printf() format, and introduced in java 1.5.

My task is, generating complex format including repeated or optional parameters. For example, with the format:

select %1 from %2 where %3 and give %1->'*' %2->'users' %3->'age>20' 

it returned:

select * from users where age>20

the format can be supported by Stirng.format().

However, I expect a format similar to:

select %1{, } from (%2(as %3)){,} (where %4 (and %5))?
when: %1->'*', %2->'users' %3->null, %3->'age>20' 

it returned:

select * from users where age>20
when: %1->Stirng{'name','age'} , %2->'users' %3->'u', %4->'age>20', %5->null 

it returned:

select name, age from users as u where age>20
when: %1->Stirng{'name','age'} , %2->'users' %3->'u', %4->null, %5->null 

it returned:

select name, age from users as u
when: %1->Stirng{'name','age'} , %2->String{'users','order'} %3->{'u','o'}, %4->'age>20',    %5->'u.id=o.userid' 

it returned:

select name, age from users as u,orders as开发者_JAVA技巧 o where age>20 and u.id=o.userid

I think now you may understand my meanings. Are there a mature library to do such complex 'anti-regexp' work?


Maybe you are looking for a CustomFormatProvider?

class SqlFormatter:IFormatProvider, ICustomFormatter
    {

        public object GetFormat(Type formatType)
        {
            return this;
        }


        public string Format(string format, object arg, IFormatProvider formatProvider)
        {
            StringBuilder concat = new StringBuilder();

            string[] formatParts = format.Split(':');

            switch (formatParts[0])
            {
                case "sqlfield":
                    string sep = "";
                    if (formatParts.Length>1)
                    {
                        sep = formatParts[1];
                    }
                    string[] fields = (string[]) arg;
                    concat.Append(fields[0]);
                    for (int fieldIndex = 1; fieldIndex < fields.Length; fieldIndex++)
                    {
                        concat.Append(sep);
                        concat.Append(fields[fieldIndex]);
                    }
                    break;
                case "sqltables":
                    concat.Append(arg.ToString());
                    break;
                default:
                    break;
            }
            return concat.ToString(); 
        }
    }

Use it like this:

 String sql = String.Format(
           new SqlFormatter()
           , "select {0:sqlfield:,} from {1:sqltables} "
           , new string[]{"name","lname"}
           , "person" );

Will give: "select name,lname from person "

I'll leave the rest of the implementation (and robustness etc) to you...

0

精彩评论

暂无评论...
验证码 换一张
取 消