0

私は実際に最初に問題を誤解していましたが、

基本的に、エラーがあるかどうかを確認し、それを壊す特定の恐ろしい文字をチェックしますが、これは括弧では機能しません。基本的に、文字列を SQL に渡す前に、文字列内に括弧があるかどうかを確認する必要があります存在する場合は、文字列から完全に削除します。

たとえば、次のような文字列があるとします

[I am a magical string with super powers!){

これらの恐ろしい括弧をすべて取り除きたいです!

 if (compiler.Parser.GetErrors().Count == 0)
        {
            AstNode root = compiler.Parse(phrase.ToLower());
            if (compiler.Parser.GetErrors().Count == 0)
            {
                try
                {
                    fTextSearch = SearchGrammar.ConvertQuery(root, SearchGrammar.TermType.Inflectional);
                }
                catch
                {
                    fTextSearch = phrase;
                }
            }
            else
            {
                fTextSearch = phrase;
            }
        }
        else
        {
            fTextSearch = phrase;
        }

        string[] errorChars = errorChars = new string[]
        {
            "'",
            "&"
        };

        StringBuilder sb = new StringBuilder();

        string[] splitString = fTextSearch.Split(errorChars, StringSplitOptions.None);

        int numNewCharactersAdded = 0;
        foreach (string itm in splitString)
        {
            sb.Append(itm); //append string
            if (fTextSearch.Length > (sb.Length - numNewCharactersAdded))
            {
                sb.Append(fTextSearch[sb.Length - numNewCharactersAdded]); //append splitting character
                sb.Append(fTextSearch[sb.Length - numNewCharactersAdded - 1]); //append it again
                numNewCharactersAdded++;
            }
        }

        string newString = sb.ToString();

        //Union with the full text search
        if (!string.IsNullOrEmpty(fTextSearch))
            {
                sql.AppendLine("UNION");
                sql.AppendLine(commonClause);
                sql.AppendLine(string.Format("AND CONTAINS(nt.text, '{0}', LANGUAGE 'English')", newString));
            }
4

2 に答える 2

1

これはそれを行う1つの方法です。括弧をハードコーディングするのではなく、一連の文字を渡してそれらの文字をテストすることで、より洗練されたものにすることができます。

var someString = "[Hello"
if(someString.contains("["))
{
    someString.Replace("[","");
}
if (someString.Contains("]"))
{ 
    someString.Replace("]","");
}
于 2012-07-25T13:52:07.833 に答える
0

私があなたを正しく理解していれば、ブラケットが一致しない場合はブラケットを削除したいだけです。

これにより、次のことが達成されます。

    public string MatchPair(string input, string item1, string item2)
    {
        var ix1 = input.IndexOf(item1);
        var ix2 = input.IndexOf(item2);

        if ((ix1 != -1) && (ix2 != -1))
        {
            return input;
        }

        if (ix1 == -1)
        {
            return this.CutString(input, ix2, item2);
        }

        if (ix2 == -1)
        {
            return this.CutString(input, ix1, item1);
        }

        return string.Empty;
    }

    public string CutString(string input, int ix, string item)
    {
        string left = input.Substring(0, ix);
        string right = input.Substring(ix + item.Length);

        return left + right;
    }

ここに私が使用したいくつかのテストデータがあります:

        var str1 = "[hello]";
        var str2 = "[hello";
        var str3 = "hel]lo";
        var str4 = "hel[lo";

        var res1 = this.MatchPair(str1, "[", "]");
        var res2 = this.MatchPair(str2, "[", "]");
        var res3 = this.MatchPair(str3, "[", "]");
        var res4 = this.MatchPair(str4, "[", "]");
于 2012-07-25T14:08:22.097 に答える