【问题标题】:Rigorous way of creating an escape sequence for delimiters为分隔符创建转义序列的严格方法
【发布时间】:2015-07-24 02:54:36
【问题描述】:

示例文本:(约翰,36 岁,阿拉巴马州)

我在代码中所做的是首先匹配圆括号 (),然后使用逗号作为分隔符分割内容。

private static IEnumerable<string> GetValues(string value)
{
  var matches = Regex.Matches(value, @"\(.*\)");
  if (matches.Count == 0) return new string[0];

  var valueSplit = matches[0].Value;
  var theString = valueSplit.Trim('(', ')');
  var wordSplit = theString.Split(',').Select(x=>x.Trim());
  return wordSplit;
} 

对于示例文本 (John, 36, Alabama) 上面的代码返回:

  • 约翰
  • 36
  • 阿拉巴马州

现在的问题是我应该如何为逗号创建一个转义序列,我已将其用作分隔符。

这样对于示例文本(约翰 36,奥尔顿,阿拉巴马州)返回

  • 约翰
  • 36
  • 阿拉巴马州奥尔顿

并且递归地允许我甚至逃避转义序列本身?我已经尝试过 String.ReplaceRegex.Replace 但无济于事。

这是Fiddle

【问题讨论】:

  • 如果您知道只有一个字段可以包含逗号(并且放在末尾),那么您可以将拆分数限制为预期字段数。
  • 两个想法。首先,处理这种情况(CSV 样式)的一种方法是将包含分隔符的字段包含在引号中,以便引号中包含的任何逗号都不是分隔符。处理此问题的另一种方法是选择不是逗号的分隔符。逗号真的不是一个很好的分隔符。你能选择一个不同的定界符,比如“|”吗?
  • @DWright 我绝对同意逗号不是最好的分隔符,但不幸的是我无法对当前设置进行任何更改。除了找到转义分隔符的方法。

标签: c# regex string escaping delimiter


【解决方案1】:

如果你只想要 3 个子字符串,那么你可以从拆分中限制它

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        foreach (var item in GetValues("(John, 36, Alabama, Whatever, Manager)"))
        {
            Console.WriteLine(item);
        }
    }

    private static IEnumerable<string> GetValues(string value)
    {
       var matches = Regex.Matches(value, @"\(.*\)");
       if (matches.Count == 0) return new string[0];

       var valueSplit = matches[0].Value;
       var theString = valueSplit.Trim('(', ')');
        var wordSplit = theString.Split(new char[]{','}, 3, StringSplitOptions.None).Select(x=>x.Trim());
       return wordSplit;
    } 
}

输出:

  • 约翰
  • 36
  • 阿拉巴马州,随便,经理

这是Fiddle

【讨论】:

  • 不幸的是,这不是转义分隔符的正确方法,至少在我的情况下,因为可以有超过 3 个值。
  • 你看过小提琴链接了吗?有了这个,您可以拥有任意多个,但只有前 2 个将分开,其他所有内容都将在第三个拆分中(包括您的分隔符)
猜你喜欢
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
相关资源
最近更新 更多