删除文本中给定单词之间的管道

时间:2016-04-19 15:28:01

标签: c#

我有一个文本,在文中我必须删除两个给定单词之间的竖线字符。 我已经搜索过并试过但没有任何成功,现在我可以使用一些帮助。

案文是:

  

Klantcode:| Aanhef en voorletters:Dhr。 A. | Tussenvoegsel en achternaam:BV | E-mailadres:test@test.nl|Straat:De Straat | Huisnummer / toevoeging:00 | Postcode:000AA | Woonplaats:PLACE | Telefoonnummer:012345678 | Bank of of gironummer:00000000 | Machtigingen :Ik verleen hierbij tot wederopzegging machtiging voor de incasso van de eenmalige kosten en periodieke abonnementskosten inclusief eventuele aanvullende diensten aan Diensten BV。| Nieuwsbrief:U wilt de maandelijkse nieuwsbrief ontvangen | Voorwaarden:U bent akkoord met onze voorwaarden | Huidig telefoonnummer behouden:Ja | Huidige nummer:012345678 | Huidige提供者:任何人,geen eenmalige kosten EDL / Film1 / Sport1 behouden,| geen comfort bellen。| Ingangsdatum abonnement:Zo snel mogelijk | Abonnement:Alles-in-1 Glas Standaard; *基本电视; *互联网150Mbps ; * VoIP-First Bellen |额外:* Glasmodem€0,00; * HD Digitale Ontvanger€0,00; * Aansluitkosten€0,00 |每个maand:Eerste 3 maanden€00,00,daarna€00,00; * Verzend- en administratiekosten€00,00; * Totaal eenmalig€00,00 | $<

我现在的代码是:

public string RemoveBetween(string baseText, string begin, string end)
    {
        Regex regex = new Regex(string.Format(@"\|", begin, end));
        return regex.Replace(baseText, string.Empty);
    }

o.Product = RemoveBetween(orderText, "Huidige provider:", "|Ingangsdatum");

这段代码没有给我想要的结果。它不会删除管道字符。 有人可以帮我解决这个问题吗?

非常感谢你!!

3 个答案:

答案 0 :(得分:2)

对我来说它看起来像一本字典:

var s = "a:b|c:d";
var sKvps = s.Split('|');

var dict = new Dictionary<string, string>();
foreach (var sKvp in sKvps)
{
    var parts = sKvp.Split(':', 2);
    dict.Add(parts[0], parts[1].Trim());
}

然后你可以用以下代码替换值:

dict["Huidge provider"] = "foo";

向后(到一个字符串):

s = string.Join("|", dict.Select(kvp => $"{kvp.Key}: {kvp.Value}"));

要修复代码,如果您更喜欢正则表达式(explanation):

public string UpdateProperty(string baseText, string property, string newValue)
{
    // look for "|PropertyName: value|" and split it into parts for replacement
    Regex regex = new Regex(string.Format(@"(\|{0}:(?: ?))([^|]*)(\|)", property));
    return regex.Replace(baseText, string.Format("$1{0}$3", newValue));
}

o.Product = UpdateProperty(orderText, "Huidige provider", "new value");

我真的不会推荐这样的东西,因为它不会将文本转移到正则表达式中。

答案 1 :(得分:0)

您需要逃离管道并松开string.format(不知道为什么会这样):

var strRegex = @"\|";
var myRegex = new Regex(strRegex, RegexOptions.IgnoreCase);
var strTargetString = @"Klantcode:|Aanhef en voorletters: Dhr. A.|Tussenvoegsel en achternaam: B.V.|E-mailadres: test@test.nl|Straat: De Straat|Huisnummer / toevoeging: 00|Postcode: 000AA|Woonplaats: PLACE|Telefoonnummer: 012345678|Bank- of gironummer: 00000000|Machtigingen: Ik verleen hierbij tot wederopzegging machtiging voor de incasso van de eenmalige kosten en periodieke abonnementskosten inclusief eventuele aanvullende diensten aan Diensten BV.|Nieuwsbrief: U wilt de maandelijkse nieuwsbrief ontvangen|Voorwaarden: U bent akkoord met onze voorwaarden|Huidig telefoonnummer behouden: Ja|Huidige nummer: 012345678|Huidige provider: Anybody, geen eenmalige kosten EDL/Film1/Sport1 behouden, |geen comfort bellen.|Ingangsdatum abonnement: Zo snel mogelijk|Abonnement:Alles-in-1 Glas Standaard;* Basic TV;* Internet 150Mbps;* VoIP-First Bellen|Extra:* Glasmodem € 0,00;* HD Digitale Ontvanger € 0,00;* Aansluitkosten € 0,00|Per maand: Eerste 3 maanden € 00,00, daarna € 00,00;* Verzend- en administratiekosten € 00,00;* Totaal eenmalig € 00,00|$<";

return myRegex.Replace(strTargetString, string.Empty);

答案 2 :(得分:0)

假设格式为:

text       = any character other than ':' or '|'
key        = text
value      = text
kvp        = key ':' value '|'
dictionary = {kvp}

并且您尝试删除与值不正确混合的|,您可以使用以下正则表达式:

// Remove any '|' that follow a '|' without an intervening ':'
Regex regex = new Regex(@"(?:\|)([^:|]*)(?=\|)");
return regex.Replace(baseText, "$1");

示例:

a:b|c|c:d|e:f|g|l:m|n:z|h|k| -> a:bc|c:d|e:fg|l:m|n:zhk|