我有一个模糊的字符串:
foo,bar,c;qual="baz,blurb",d;junk="quux,syzygy"
Run Code Online (Sandbox Code Playgroud)
我想用逗号分割 - 但我需要在引号中忽略逗号.我怎样才能做到这一点?好像正则表达式方法失败了; 我想我可以在看到引号时手动扫描并进入不同的模式,但是使用预先存在的库会更好.(编辑:我想我的意思是已经是JDK的一部分或已经是Apache Commons等常用库的一部分的库.)
上面的字符串应该分成:
foo
bar
c;qual="baz,blurb"
d;junk="quux,syzygy"
Run Code Online (Sandbox Code Playgroud)
注意:这不是CSV文件,它是包含在具有更大整体结构的文件中的单个字符串
特定
2,1016,7 /二千○八分之三十一14:22,杰夫达尔加斯6 /二千零十一分之五22:21,http://stackoverflow.com, "科瓦利斯,OR",7679,351,81,b437f461b3fd27387c5d8ab47a293d35,34
如何使用C#将上述信息拆分为字符串,如下所示:
2
1016
7/31/2008 14:22
Geoff Dalgas
6/5/2011 22:21
http://stackoverflow.com
Corvallis, OR
7679
351
81
b437f461b3fd27387c5d8ab47a293d35
34
Run Code Online (Sandbox Code Playgroud)
如您所见,其中一列包含,<=(Corvallis,OR)
// update //基于 C#Regex Split - 引号外的逗号
string[] result = Regex.Split(samplestring, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
Run Code Online (Sandbox Code Playgroud) 我正在尝试拆分表示XPath的字符串,例如:
string myPath = "/myns:Node1/myns:Node2[./myns:Node3=123456]/myns:Node4";
Run Code Online (Sandbox Code Playgroud)
我需要拆分'/'('/'从结果中排除,就像正常的字符串拆分一样),除非'/'碰巧在'[...]'之内(其中'/'都不是分开,也包括在结果中).
那么正常的事情string[] result = myPath.Split("/".ToCharArray())
让我:
result[0]: //Empty string, this is ok
result[1]: myns:Node1
result[2]: myns:Node2[.
result[3]: myns:Node3=123456]
result[4]: myns:Node4
Run Code Online (Sandbox Code Playgroud)
results[2]
并result[3]
应主要结合起来,我应该结束了:
result[0]: //Empty string, this is ok
result[1]: myns:Node1
result[2]: myns:Node2[./myns:Node3=123456]
result[3]: myns:Node4
Run Code Online (Sandbox Code Playgroud)
由于我不是非常流利的正则表达式,我已经尝试在拆分后手动将结果重新组合成一个新的数组,但我担心的是,尽管让它在这个例子中起作用是微不足道的,但正则表达式似乎是更好的选择.我得到更复杂的xpaths的情况.
为了记录,我查看了以下问题:正则
表达式拆分字符串保留引号
C#Regex Split - 引号外的引号
拆分具有空格的字符串,除非它们包含在"引号"中?
虽然他们应该足以帮助解决我的问题,但我遇到了一些问题/困惑的方面,阻止他们帮助我.
在前2个链接中,作为正则表达式的新手,我发现它们难以解释和学习.他们正在寻找引用,左右对之间看起来相同,所以把它翻译成[和]让我感到困惑,试错不教我任何东西,而是让我更加沮丧.我可以理解相当基本的正则表达式,但这些答案的作用比我目前理解的要多一点,即使在第一个链接中有解释.
在第三个链接中,我将无法访问LINQ,因为代码将在旧版本的.NET中使用.
我试过这个:
+|(?!(\"[^"]*\"))
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我还能做些什么让它发挥作用?顺便说一句,我使用java的string.split().
var result = Regex.Split(samplestring, ",(?=(?:[^\"]*\"[^\"]*')*[^\"]*$)");
Run Code Online (Sandbox Code Playgroud)
我有问题要了解它是如何工作的.
具体来说,我不知道这里匹配的是什么?
",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)")
^
Run Code Online (Sandbox Code Playgroud)
这是不是意味着
有0或更多 (?=(?:[^\"]*\"[^\"]*')
更新样本输入
2,1016,7/31/2008 14:22,Geoff Dalgas,6/5/2011 22:21,http://stackoverflow.com,"Corvallis, OR",7679,351,81,b437f461b3fd27387c5d8ab47a293d35,34
Run Code Online (Sandbox Code Playgroud)
使用以下代码进行测试:
string samplestring = "2,1016,7/31/2008 14:22,Geoff Dalgas,6/5/2011 22:21,http://stackoverflow.com,\"Corvallis, OR\",7679,351,81,b437f461b3fd27387c5d8ab47a293d35,34";
Run Code Online (Sandbox Code Playgroud)