用于根据空格分隔符拆分文本的正则表达式 [重复]
Posted
技术标签:
【中文标题】用于根据空格分隔符拆分文本的正则表达式 [重复]【英文标题】:Regex used to split a text based on space delimiters [duplicate] 【发布时间】:2017-07-17 07:49:49 【问题描述】:我正在尝试拆分下面的文本,因此字符串被空格分隔,除非标记在引号之间。出乎意料的结果是它也被我不想要的.
字符拆分。
string txt = "PROGRAM \"My ETABS\" VERSION \"9.7.4\" MERGETOL 0.1";
string[] split = Regex.Matches(txt, "(\\w+|\".*?\")")
.Cast<Match>()
.Select(m => m.Value)
.Select(o => o.Replace("\"", ""))
.ToArray();
我得到了什么:
PROGRAM
My ETABS
VERSION
9.7.4"
MERGETOL
0
1
我需要什么:
PROGRAM
My ETABS
VERSION
9.7.4"
MERGETOL
0.1
【问题讨论】:
看起来你最好设置一个 CSV 解析器以允许用引号括起来的值并将分隔符设置为空格。 @AndrewMorton 谢谢安德鲁。你能推荐一个可以处理这些情况的好方法吗? 我会远离 CSV 解析器。 【参考方案1】:您可以交换子表达式,然后用\S
代替\w
和
它应该工作。 (".*?"|\S+)
要在不捕获引号的情况下执行此操作,"(.*?)"|(\S+)
where only
一组将包含数据。为此,您需要找到下一个直到完成。
每个发现都可以连接两个组。
【讨论】:
既然"
是单字符,那("[^"]*"|\S+)
不是更好吗?
@cfqueryparam - 更好?我不知道。它们不一样。如果您认为这会有所不同,我可以对两者进行基准测试。
已完成迭代:300 / 300 ( x 1000 ) 每次迭代找到的匹配项:6 Regex1: ("[^"]*"|\S+) 已用时间:2.99 s、2988.36 ms、2988362 µs Regex2 : (".*?"|\S+) 经过时间: 2.87 s, 2873.48 ms, 2873477 µs
俗话说,touché
。我认为能够跳过惰性量词会更好。无论如何,无论哪种变体,这都是 imo 更好的答案。以上是关于用于根据空格分隔符拆分文本的正则表达式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章