用于根据空格分隔符拆分文本的正则表达式 [重复]

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 更好的答案。

以上是关于用于根据空格分隔符拆分文本的正则表达式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

用于在所有空格处拆分的正则表达式 Python [重复]

用于 CSV 拆分的正则表达式,包括多个双引号

根据正则表达式拆分字符串

什么是正则表达式

Python - 用于将文本拆分为句子的正则表达式(句子标记)[重复]

在Python中使用多个分隔符拆分字符串[重复]