【问题标题】:C# Regex.Replace not matching and removing double quotesC# Regex.Replace 不匹配并删除双引号
【发布时间】:2014-11-21 08:32:00
【问题描述】:

我在 Google 上搜索了答案,并在 Stack Exchange 上发现了一些问题,提出了类似的问题,但他们没有帮助我。例如,我找到了C# regex - not matching my string,但给出的答案太复杂了,我无法理解。我不知道或理解正则表达式。我要做的就是从字符串中去掉双引号。

简单地说,我有一个字符串 "\"123.456\"",我需要删除 "\""

所以我做了我的表达 "[^\w\\"]" 并在调用之后

string myString Regex.Replace("\"123.456\"", "[^\\w\\\"]", "",
                    RegexOptions.None, TimeSpan.FromSeconds(1.5));

myString 是 "\"123.456\""。我只需要知道我的表情应该是什么。我将无法理解任何关于学习正则表达式的冗长讨论或讲座。

我在http://msdn.microsoft.com/en-us/library/844skk0h(v=vs.110).aspx 直接从 Microsoft 获得了我的示例,所以基本上我所做的只是将“.@-”替换为“\”。

更新 显然试图问一个简单的问题只会吸引巨魔。我不想变得太复杂,因为我不想让你们所有辛勤工作的忙碌的人花太多时间回答错误的问题。我试着表现得很好。

我们有这样一种情况,我们需要解析来自多个客户端的输入文件,然后,客户端的数量会增加,每个客户端的文件数量也会增加。

我们发现在我们的几个客户传输的文件中,许多字段都会有各种额外的字符。我们不知道这些角色是如何或为什么在那里的,我们的客户也没有告诉。 (如果你想知道他们为什么不说,请继续,这些不是你要找的问题)

因此,我们有来自许多客户的许多文件,每个文件都有许多行和许多数据字段,我们需要去除“坏”字符。

我采用了微软的方法,并对其进行了一些更改以使其更具动态性。

    private string CleanInput(string strIn, string chars)
    {
        // Replace invalid characters with empty strings. 
        try
        {
            string regexString = string.Format(@"[^\w\{0}]", chars);
            return Regex.Replace(strIn, regexString, "",
                                 RegexOptions.None, TimeSpan.FromSeconds(1.5));
        }
        // If we timeout when replacing invalid characters,  
        // we should return Empty. 
        catch (RegexMatchTimeoutException)
        {
            return string.Empty;
        }

这里的目标是能够去除任何不属于动态的字符但我们不能只对这些字符进行硬编码,因为并非所有字段都有这些字符,更重要的是,某些字段会有一些错误字符以及其他不被视为对该字段有害但对其他字段可能被视为不良字符的字符。

到目前为止还和我在一起?

因此,为了在周五(是的,明天)之前完成我的工作,我决定从 3 个输入文件中的几个已知坏字符开始慢慢开始。到目前为止,这些字符是单引号、破折号、双引号、美元符号、逗号。但并不是我的 3 个文件中的所有字段都需要去除这些字符,所以我打算只在那些需要它的字段上调用 ​​CleanInput 方法,并且只针对我们需要去除的字符。

好的,所以当我在测试时,我发现在一个字段中,我们想要去除逗号、单引号、双引号和美元符号,它并没有删除双引号(显然也是反斜杠)。因此,我首先只传入逗号 - 来调试这个问题。然后我尝试只传入单引号 - 这有效。然后我通过了美元符号 - 这有效。然后我传入了转义的双引号 - 这不起作用 - 双引号仍在字符串中。所以我在一个新的控制台项目中简化了我的测试,我对字符串进行了硬编码,我调用了我的方法,只是为了确保没有其他东西可以干扰它。

我希望并祈祷没有人花费他们宝贵的时间尝试重新配置我的输入文件或尝试教我结束所有正则表达式编程。我必须在明天之前完成这件事。拜托,我只想知道如何从给定的字符串中去掉双引号(显然还有反斜杠)。

【问题讨论】:

  • 您要替换两个引号吗?即你想以123.456结束?
  • 您知道\" 是一个字符,而不是两个,对吧?
  • 如果你只想删除"的前导和尾随字符,你可以使用yourString = yourString.Trim('"')
  • 你想收到的最后一个字符串是什么?
  • @James 你想要一个未知规格的通用答案吗?

标签: c# regex


【解决方案1】:

也许您可以使用替换而不是涉及正则表达式?

var myString = "\\\"123.456\\\"";
var myCleanString = myString.Replace(@"\""", "");

【讨论】:

  • 是的。吻。正则表达式是一个简单问题的复杂解决方案。
【解决方案2】:

您正在匹配一个否定组([^] 位)。这匹配方括号中的任何字符 not 并替换它。您想替换组中的任何内容,只需将要替换的字符放在方括号内并删除否定(^)即可:

private static string CleanInput(string strIn, string chars)
{
    // Replace invalid characters with empty strings. 
    try
    {
        string regexString = string.Format(@"[{0}]", chars);
        return Regex.Replace(strIn, regexString, "",
                                RegexOptions.None, TimeSpan.FromSeconds(1.5));
    }
    // If we timeout when replacing invalid characters,  
    // we should return Empty. 
    catch (RegexMatchTimeoutException)
    {
        return string.Empty;
    }
}

如果您知道要包含而不是排除什么,您会使用否定版本。例如,如果您知道您只需要数字和句点字符,您可以这样做:

string myString = Regex.Replace("\"123.456\"", "[^\\d.]", "",
                RegexOptions.None, TimeSpan.FromSeconds(1.5));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2016-12-13
    • 2020-03-21
    • 2018-10-24
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多