将String转换为String [],但不能在逗号中使用逗号

时间:2018-08-09 11:44:03

标签: c#

我有一个字符串

String strValue = "city, image, N'Hello, World , It Rain', picture";

我想转换为String [],我使用了strValue.Split(',')

结果:

[
city, 
image, 
N'Hello, 
World, 
It Rain', 
picture
]

但是我不想分裂N'Hello,世界,下雨'

我希望结果是:

[
city,
image,
N'Hello, World , It's Rain',
picture
]

谢谢大家。

4 个答案:

答案 0 :(得分:6)

假设您的字符串值使用逗号分隔,然后使用空格分隔,则可以使用以下行将其拆分为使用多个字符作为分隔符的数组,如示例所示。

String[] strValues = strValue.Split(new string[] { ", " }, StringSplitOptions.None);

这里是DotNetFiddle


编辑-鉴于需求的突然变化...

如果您不关心结果的顺序,并且想再次提取所有相同格式的句子,('N<sentence>')我们可以使用类似的方法快速提取值: / p>

String strValue = "city, image, N'Hello, World , It Rain', picture";

// Match the sentences by N'{text}'
var strValues = Regex.Match(strValue, "(?<=N')(.*?)(?=')");

// Remove the sentences from the string
foreach(var matchedVal in strValues.Captures){
    var toRepl = String.Format("N'{0}', ", matchedVal.ToString());
    strValue = strValue.Replace(toRepl, "");
}

// Split the remainder of the string
List<string> strOtherValues = strValue.Split(new string[] { ", " }, StringSplitOptions.None).ToList();

// Add all sentences to words list
foreach (var matchedVal in strValues.Captures)
{
    strOtherValues.Add(matchedVal.ToString());
}

答案 1 :(得分:0)

似乎您的字符串格式已知有4个逗号分隔的字段,在这种情况下,请使用regex知道第3个字段可能带有逗号:

    String strValue = "city, image, N'Hello, World , It Rain', picture";
    Pattern PATTERN = Pattern.compile("([^,]+), ([^,]+), (.+), ([^,]+)");

    Matcher matcher = PATTERN.matcher(strValue);
    if (matcher.find()) {
        System.out.println(matcher.group(1));
        System.out.println(matcher.group(2));
        System.out.println(matcher.group(3));
        System.out.println(matcher.group(4));
    }

答案 2 :(得分:0)

好吧,真是一团糟;可能也有可怕的表现。但至少似乎可以做您想要的事情(还没有测试很多极端情况)。

问题是,您需要以某种方式区分是在原始字符串的“内部”还是“外部”“转义”部分之间。如果您在“内部”,则应该进行分隔符的常规拆分。

public static IEnumerable<string> MySpecialSplit(string value, string separator, string escapeStart, string escapeEnd)
{
    var result = new List<string>();

    var start = value.StartsWith(separator) ? separator.Length : 0;
    var inEscape = false;

    for (var i = start; i < value.Length - separator.Length; i++)
    {
        if (inEscape && value.Length > i + escapeEnd.Length && value.Substring(i, escapeEnd.Length).Equals(escapeEnd))
        {
            inEscape = false;
        }
        else if (!inEscape && value.Length > i + escapeStart.Length && value.Substring(i, escapeStart.Length).Equals(escapeStart))
        {
            inEscape = true;
        }

        if (!inEscape && value.Substring(i, separator.Length).Equals(separator))
        {
            result.Add(value.Substring(start, i - start));
            i += separator.Length;
            start = i;
            i--;
        }
    }

    if (start < value.Length - separator.Length)
    {
        var rest = value.Substring(start);
        if (rest.EndsWith(separator))
        {
            rest = rest.Substring(0, rest.Length - separator.Length);
        }
        result.Add(rest);
    }

    return result;
}

使用方式:

var splitted = MySpecialSplit("city, image, N'Hello, World , It's Rain', picture", ", ", "N'", "',");
Console.WriteLine(string.Join(Environment.NewLine, splitted));

结果:

city
image
N'Hello, World , It's Rain'
picture

答案 3 :(得分:-3)

尝试一下

Matcher matcher = PATTERN.matcher(strValue);
if (matcher.find()) {
    System.out.println(matcher.group(1));
    System.out.println(matcher.group(2));
    System.out.println(matcher.group(3));
    System.out.println(matcher.group(4));
}