【问题标题】:Find and replace * in strings using regular expressions in C#在 C# 中使用正则表达式查找和替换字符串中的 *
【发布时间】:2011-03-29 03:08:32
【问题描述】:

我有一个包含许多描述字符串 (1000s) 的大型 X12 EDI 文件。这些描述字符串可以在具有相同分隔符*的其他字符串之前、之后和之间找到。

所有描述字符串都以标记REF*TC** 开头并以字符~ 结尾。

我需要查找并替换出现在这两个标签之间的所有*,而不涉及其他字符串,在本例中为 DTM 字符串。

我包含两个描述字符串的示例,因为它们可以在文件中找到。如您所见,第一个描述字符串包含我需要替换的*,第二个描述字符串不包含任何需要替换的*

~REF*TC**BLAH*BLAH*~REF*TC**BLAHBLAH~REF*TC***BLAH~DTM*010*20110329~

想要的输出:

~REF*TC**BLAHBLAH~REF*TC**BLAHBLAH~REF*TC**BLAH~DTM*010*20110329~

我正在使用 C#

这是我目前所拥有的。

查找表达式:REF\*TC\*\*(.{0,}?)(\*+)(.{0,}?)(\**)(.{0,}?)(\**)~

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    这是我想出的:

    var str = "~REF*TC**BLAH*BLAH*~REF*TC**BLAHBLAH~REF*TC***BLAH~DTM*010*20110329~";
    var result = (new Regex(@"(?<pre>REF\*TC\*\*)(?<text>.*?)(?<post>~)")).Replace(str,(m) =>
    {
        return String.Join(String.Empty,new String[]{
            m.Groups["pre"].Value,
            m.Groups["text"].Value.Replace("*",String.Empty),
            m.Groups["post"].Value
        });
    });
    

    DEMO

    说实话,这只是基于您提供的内容,但并不是 100% 确定您的目标。

    【讨论】:

    • 它不是纯正则表达式,是正则表达式和 .Net .Replace 的组合,但它有效。关于如何用纯正则表达式来做的任何想法?
    • @Jason:您可能可以使用否定的前瞻和量词来取消额外的* 的资格,但我对此表示怀疑。我想你将不得不这样做。这就是 .Replace 方法的存在。
    • 是的,我正沿着同一个轨道向前看,哦,好吧。感谢您及时的回复。我有一个预构建的应用程序,它只接受巨大的字符串并进行迭代正则表达式查找和替换。希望不必重新编码应用程序,但会这样做,并且只包含您的逻辑。谢谢。
    • 布拉德,无论如何要在没有 lambda 表达式的情况下执行此操作?我在 .NET 2.0 中。
    • @Brad,你能给我我在 .NET 2.0 中不需要 lambda 表达式的代码吗?
    【解决方案2】:

    正则表达式很棒,但正如那句名言所说,Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems. 跳过正则表达式并在其上使用字符串方法。您可以简单地将其拆分为REF*TC** 开始标签,然后替换所有* 字符,或者您可以尝试更复杂的东西。当简单的字符串方法可行时,不要一直使用正则表达式。

    编辑:

    这是一个非常简单的例子:

    string[] lines = file.Split("REF*TC**");
    for(int i=0;i<lines.Length;i++)
    {
        lines[i] = lines[i].Replace("*", "");
    }
    string output = string.Join("REF*TC**", lines);
    

    你可能需要在最后清理一个额外的“REF*TC**”,我不记得 Join() 是如何处理它的。无论如何,应该这样做。

    【讨论】:

    • 问题是,如果您在我的示例中看到,在 REFTC* 之后可能会出现其他无法修改的行。例如:~DTM*010*20110329~ 需要单独放置。不过感谢您的快速回复。
    • 描述字符串确实与文件中的其他字符串混合在一起,因此仅通过 REFTC* 拆分字符串会在它创建的字符串数组中吸收太多数据.
    • 我明白了——我没有从这个例子中理解这一点——也许我没有仔细阅读这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2014-06-26
    相关资源
    最近更新 更多