C#中regex.unescape替代引号(“)

时间:2016-02-29 19:19:07

标签: c# .net regex

所以我在这里面临一个问题,我肯定有一个简单的答案,但我似乎无法找到它。

我正在使用C#代码比较来自2个表的字符串数据 当两个表中的数据为空或为空时,我希望比较返回“True”,这基本上意味着它们是相同的。

我使用string.IsNullorEmpty来检查null或空条件。 问题出在一个表中,字符串值为"",而另一个表具有相同的值转义并显示为"\"\""

我假设使用regex.unescape将解决此问题,但它似乎没有工作,我得到一个输出,两个值都不同导致问题。

我发现的一个解决方案是直接检查是否str == "\"\""来解决问题。

但是有更清洁的选择吗?

1 个答案:

答案 0 :(得分:2)

我认为你在这里混合了一些东西。

如果你的字符串来自同一个数据源,那么所有字符串都会被转义,或者它们都没有被转义(如果不是这样的话,那么你遇到的问题比你说的要大。)

所以,如果它们没有被转义,其中一个包含"",另一个包含\"\",则它们不相等,一个是2个字符,另一个是是4。

所以我假设他们被转义并且你的第一个字符串在数据库中实际上是空的(它不包含任何字符),第二个字符串是\"\"

然后您可以使用Regex.Unescape如果它们总是被转义),但这两个字符串不相同:一个是空的,另一个包含(一旦未转义), "",所以第一个字符串不包含任何字符,第二个字符串包含两个字符:难怪它们不会被比较相等。

现在,如果它们确实被转义,那么包含""的那个没有意义,因为这些字符应该被转义。如果不是这种情况,那么你有一个非常具体的问题,这不是你要求的:你需要确定你的字符串是否从数据源中被转义......除非有一个非常具体的内容,否则基本上是不可能的确定如此的一套规则。

如果数据源包含随机转义字符串或非字符串字符串,请假设您的数据源返回字符串\"\":您如何确定实际内容是否已转义,它意味着{'"','"'}(每个字符为2个字符)它们是双引号),或者如果它不是,它是4个字符,代表{'\','"','\','"'} (一个反斜杠,一个双引号,一个反斜杠和一个双引号) ?除非你有一个确定这些规则的规范(或者说字符串是否被转义的另一个字段),否则没有办法告诉你。

所以,回到你的问题:虽然你没有放任何代码,但我的猜测是没有错:要么你的期望是错的(你希望\"\"意味着一个字符串是空的,但它没有,因为它并不意味着),或者你的数据是错误的。

无论哪种方式,都没有任何通用代码解决方案...... 特定案例的特定代码解决方案(如您正在展示的那些),但不是一般的:用您在问题中提供的信息,这是不可能的

在所有这些bab呀学语之后,现在针对特定答案,如果您的表格A包含非转义字符串,并且您的表格B包含转义字符串:

stringFromTableA == Regex.Unescape(stringFromTableB)

如果true包含stringFromTableA""包含stringFromTableB,则应返回\"\"Check it这些都不是空的,因此string.IsNullOrEmpty()将返回false

更新:如果你在Visual Studio调试器中检查这些字符串值,调试器会显示它们被转义,所以如果你在一个中发现""而在另一个中发现\"\",那么你的第一个字符串为空(string.IsNullOrEmpty将返回true),第二个字符串包含两个双引号:string.IsNullOrEmpty将返回false,因为它实际上不是null或空。并且Regex.Unescape在这种情况下不会做任何事情,因为你的字符串不包含任何\并且没有任何东西可以逃脱,只是显示那些\的调试器。