Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字符串.Replace未按预期工作_C#_String - Fatal编程技术网

C# 字符串.Replace未按预期工作

C# 字符串.Replace未按预期工作,c#,string,C#,String,我有一个计划 public void TestMethod2() { string[] keywords = { "SELECT", "FROM", "WHERE", "GROUP", "HAVING", "ORDER", "LEFT", "RIGHT", "JOIN", "INNER", "OUTER", "ASC", "DESC", "AND", "OR","IN", "BETWEEN", "B

我有一个计划

    public void TestMethod2()
    {
        string[] keywords =
        {
            "SELECT", "FROM", "WHERE", "GROUP", "HAVING", "ORDER", "LEFT",  "RIGHT", "JOIN", "INNER", "OUTER", "ASC",
            "DESC", "AND", "OR","IN", "BETWEEN", "BY", "NOT", "ON", "AS", "CASE", "WHEN", "ELSE", "UPDATE", "SET"
        };

        var actualString = "SELECT * FROm A Join B On C in D case e join t left outer join inner join right join";

        foreach (var text in actualString.Split(' '))
        {
            var isExists = keywords.Any(x => x.Equals(text, StringComparison.OrdinalIgnoreCase));

            if (!isExists)
            {
                continue;
            }

            actualString = actualString.Replace(text, text.ToUpper());
        }


        var expectedString = "SELECT * FROM A JOIN B ON C IN D CASE e JOIN t LEFT OUTER JOIN INNER JOIN RIGHT JOIN";

    }
我是C语言的新手。我不清楚为什么替换方法不能按预期工作。它正在显示输出 选择*从A连接B到C在D情况下e连接t左外连接内连接右连接

有人能告诉我为什么会这样吗?
提前谢谢

如果你调试它,你会注意到你的关键字in替换了第二个join,所以你得到了join。稍后,您的文本变量将尝试用join替换join,但它找不到join,因为它的一部分是大写的

问题是您已经替换了IN-join。因此,当您想用join替换join时,比较失败。加入!=join

它的行为符合预期。以下是逐行输出:

[SELECT] -> SELECT * FROm A Join B On C in D case e join t left outer join inner join right join [FROm] -> SELECT * FROM A Join B On C in D case e join t left outer join inner join right join [Join] -> SELECT * FROM A JOIN B On C in D case e join t left outer join inner join right join [On] -> SELECT * FROM A JOIN B ON C in D case e join t left outer join inner join right join [in] -> SELECT * FROM A JOIN B ON C IN D case e joIN t left outer joIN INner joIN right joIN [case] -> SELECT * FROM A JOIN B ON C IN D CASE e joIN t left outer joIN INner joIN right joIN [join] -> SELECT * FROM A JOIN B ON C IN D CASE e joIN t left outer joIN INner joIN right joIN [left] -> SELECT * FROM A JOIN B ON C IN D CASE e joIN t LEFT outer joIN INner joIN right joIN [outer] -> SELECT * FROM A JOIN B ON C IN D CASE e joIN t LEFT OUTER joIN INner joIN right joIN [join] -> SELECT * FROM A JOIN B ON C IN D CASE e joIN t LEFT OUTER joIN INner joIN right joIN [inner] -> SELECT * FROM A JOIN B ON C IN D CASE e joIN t LEFT OUTER joIN INner joIN right joIN [join] -> SELECT * FROM A JOIN B ON C IN D CASE e joIN t LEFT OUTER joIN INner joIN right joIN [right] -> SELECT * FROM A JOIN B ON C IN D CASE e joIN t LEFT OUTER joIN INner joIN RIGHT joIN [join] -> SELECT * FROM A JOIN B ON C IN D CASE e joIN t LEFT OUTER joIN INner joIN RIGHT joIN 您可以看到,当in被in替换时,在第5行;然后join被join替换

但是,随后发生的情况是,您对关键字.Any的调用工作正常,并且匹配join和join,但是,替换调用仍然区分大小写,并且不会进行替换

Replace是区分大小写的,不幸的是,.NET不提供区分大小写的版本;但也有一些解决办法


检查一个不区分大小写的替换的实现。

从这里的答案中得到了一个清晰的想法。最后通过使用for循环更改foreach来解决这个问题。谢谢大家

public void TestMethod2()
{
    string[] keywords =
    {
        "SELECT", "FROM", "WHERE", "GROUP", "HAVING", "ORDER", "LEFT",  "RIGHT", "JOIN", "INNER", "OUTER", "ASC",
        "DESC", "AND", "OR","IN", "BETWEEN", "BY", "NOT", "ON", "AS", "CASE", "WHEN", "ELSE", "UPDATE", "SET"
    };

    var actualString = "SELECT * FROm A Join B On C in D case e join t left outer join inner join right join";

    var cnt = sqlTest.Split(' ').Count();
    for (int i = 0; i < cnt; i++)
    {
        var text = sqlTest.Split(' ')[i];
        var isExists = keywords.Any(x => x.Equals(text, StringComparison.OrdinalIgnoreCase));

        if (!isExists)
        {
            continue;
        }

        actualString = actualString.Replace(text, text.ToUpper());
    }


    var expectedString = "SELECT * FROM A JOIN B ON C IN D CASE e JOIN t LEFT OUTER JOIN INNER JOIN RIGHT JOIN";

}
我建议使用Regex.Replace而不仅仅是String.Replace

当且仅当子字符串是一个整词时,按顺序将其视为关键字的模式:

应该变成

 SELECT horror -- even if horror has two "or"
   FROM torro  -- even if torro has two "or"
  WHERE corner = 1 -- even if corner contains "or"
     OR ordain = 2 -- even if ordain contains "or"
实施:

string[] keywords = {
  "SELECT", "FROM", "WHERE", "GROUP", "HAVING", "ORDER", "LEFT",  "RIGHT",
  "JOIN", "INNER", "OUTER", "ASC", "DESC", "AND", "OR","IN", "BETWEEN", 
  "BY", "NOT", "ON", "AS", "CASE", "WHEN", "ELSE", "UPDATE", "SET"
};

var actualString = 
  "SELECT * FROm A Join B On C in D case e join t left outer join inner join right join";

foreach (var keyword in keywords)
  actualString = Regex.Replace(
    actualString,
    @"\b" + Regex.Escape(keyword) + @"\b",
    keyword.ToUpper(),
    RegexOptions.IgnoreCase); 

因为这是关于一个sql字符串,而这些字符串的开头或结尾都不是“in”或其他sql单词分数,所以一个简单的修复方法是用空格将needle和haystack包围起来。另外:注意答案的前三个单词@Zbigniew-实际上我的错误是我认为foreach的工作方式类似于for loop。现在我明白了。谢谢。@NoorAShuvo我看不出有什么帮助。谢谢@Thomas。知道了。
 SELECT horror -- even if horror has two "or"
   FROM torro  -- even if torro has two "or"
  WHERE corner = 1 -- even if corner contains "or"
     OR ordain = 2 -- even if ordain contains "or"
string[] keywords = {
  "SELECT", "FROM", "WHERE", "GROUP", "HAVING", "ORDER", "LEFT",  "RIGHT",
  "JOIN", "INNER", "OUTER", "ASC", "DESC", "AND", "OR","IN", "BETWEEN", 
  "BY", "NOT", "ON", "AS", "CASE", "WHEN", "ELSE", "UPDATE", "SET"
};

var actualString = 
  "SELECT * FROm A Join B On C in D case e join t left outer join inner join right join";

foreach (var keyword in keywords)
  actualString = Regex.Replace(
    actualString,
    @"\b" + Regex.Escape(keyword) + @"\b",
    keyword.ToUpper(),
    RegexOptions.IgnoreCase);