分割逗号但不分割斜杠与逗号

7
问题: 如何编写一个表达式来在','上拆分字符串,但不是在'/,'上拆分?稍后我想将'/,'替换为', '

细节...

分隔符: ','

跳过字符: '/'

示例输入: "Mister,Bill,is,made,of/,clay"

我想将此输入拆分为一个数组: {"Mister", "Bill", "is", "made", "of, clay"}

我知道如何使用char prev, cur;和一些索引器来完成这个任务,但那似乎有点过时了。

Java Regex具有拆分功能,但我不知道如何在C#中复制此行为。

注意: 这不是重复的问题,这是相同的问题,只是针对不同的语言。


分隔符和跳过字符是保存在全局类中的常量。它们应该可以更改。 - visc
最终,你想做什么? - Robin
2
我正在创建自己的CSV读/写程序。我们看了一下csvHelper,但它提供的功能超出了我们的需求。我想要将CSV文件加载到一个List<Dictionary>结构中。我正在寻找一种简单直接的方法将CSV转换为数组。 - visc
2
@JeffreyHainesпјҡдҪ д№ҹеҸҜд»ҘзңӢзңӢиҝҷдёӘCSVйҳ…иҜ»еҷЁжҲ–еҶ…зҪ®зҡ„TextFieldParserзұ»гҖӮй“ҫжҺҘ - Tim Schmelter
5个回答

12

我相信你正在寻找一个负向回顾后发表

var regex = new Regex("(?<!/),");
var result = regex.Split(str);

这将在所有没有斜杠前导的逗号处分割str。如果您想保留字符串中的'/,',则此方法适用。

由于您说您想要分割字符串并且稍后用', '替换'/,',因此您需要先执行上述操作,然后您可以迭代结果并进行如下字符串替换:

var replacedResult = result.Select(s => s.Replace("/,", ", ");

嘿,@Luke 我用 Python 做不到同样的事情。怎么办?我也遇到了同样的问题。 - Devang Padhiyar
1
谢谢,@Luke。这对我们帮助很大。这是我在 Python 中使用的方法 re.split(r"(?<!\\)\.", path)。它起作用了! - Devang Padhiyar

3
string s = "Mister,Bill,is,made,of/,clay";
var  arr = s.Replace("/,"," ").Split(',');

输出结果:{"Mister", "Bill", "is", "made", "of clay"}


翻译内容:该代码的输出结果为数组,其中包含了字符串"Mister"、"Bill"、"is"、"made"和"of clay"。

你的程序是唯一一个真正做到了被要求的事情,这比其他人所说的要容易得多。(因为他想用空格替换“/,”,正如他的例子所证明的那样) - Colin DeClue
6
但是“稍后我想用','替换'/,'”听起来好像最终数组的最后一个项目应该是:of,clay。使用您的方法,您必须在哪里插入逗号才能丢失信息。 - Tim Schmelter
1
问题已经被编辑,因此示例输出与他回答时的不同。 - Colin DeClue

2

使用正则表达式:

var result = Regex.Split("Mister,Bill,is,made,of/,clay", "(?<=[^/]),");

2
使用否定字符的正向先行断言?看起来很复杂。 - Luke Willis
@LukeWillis:确实,Regex.Split(",x", "(?<=[^/]),") 返回 {",x"},但我期望得到 {"", "x"} - Gabe
@Gabe 这是因为这要求每个逗号都必须在一个不是反斜杠的字符之前。 - Luke Willis

1

只需使用 Replace 函数从字符串中删除逗号:

 s.Replace("/,", "//").Split(',').Select(x => x.Replace("//", ","));

5
那似乎很乐观。谁能说数据中没有包含“//”呢? - ths

0

你可以在C#中使用这个

string regex = @"(?:[^\/]),";
var match = Regex.Split("Mister,Bill,is,made,of/,clay", regex, RegexOptions.IgnoreCase);

之后,您可以替换/,并按照您的喜好继续操作。


1
-1,你的代码返回了“Miste”,“Bil”,“i”,“mad”,“of / clay”,这显然是不正确的。 - Gabe
这是因为 (?:<expr>) 是一个捕获组。所以,在逗号之前的任何非斜杠字符都被 Split 消耗掉了。 - Luke Willis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接