从报价中提取数据?

Posted

技术标签:

【中文标题】从报价中提取数据?【英文标题】:Pulling data out of quotes? 【发布时间】:2010-09-17 14:47:27 【问题描述】:

我正在寻找一个正则表达式,它可以在字符串中提取带引号的部分,包括单引号和双引号。

IE:

"This is 'an example', \"of an input string\""

匹配:

一个例子 输入字符串

我写了这个:

 [\"|'][A-Za-z0-9\\W]+[\"|']

它有效,但有人发现它有任何缺陷吗?

编辑:我看到的主要问题是它无法处理嵌套引号。

【问题讨论】:

您提供的正则表达式似乎与您的示例字符串完全不匹配。引号内的空格怎么办? 我认为您的意思是 [\"'],因为 [\"|'] 将匹配 | (管)也是。您不需要管道在方括号中表示“或”。 ***.com/questions/171480/…> 特别是这些答案:***.com/questions/171480/…> ***.com/questions/171480/…> 不允许在开头使用单引号,在结尾使用双引号,反之亦然,以及在开头和结尾使用相同的引号。 【参考方案1】:

它如何处理双引号内的单引号(反之亦然)?

"This is 'an example', \"of 'quotes within quotes'\""

应该匹配

一个例子 的“引号内的引号”

如果需要支持,请使用反向引用。

(\"|')[A-Za-z0-9\\W]+?\1

编辑:修正为使用不情愿的量词。

【讨论】:

这不适用于像这样的字符串:"foo foo \"match\" foo \"match\" foo",它返回 "\"match\" foo \"match\" " 作为唯一的匹配项。 那是因为 \W 是非单词字符类,而不是我想的空白类。我的记忆不像以前那样了。 没有。 :-) 是因为“+”贪婪地匹配到字符串的末尾,在回溯发生之前,最后一个适用的引号被提供给反向引用“\1”。 就此而言,您现在使用的“\s”将无法匹配标点符号、重音字符或希腊字符等... 好吧,那是我的错。我误解了要匹配的内容。我认为它匹配字母数字和空格。所以改成不情愿的量词是这里的门票。【参考方案2】:

喜欢吗?

"([\"'])(.*?)\1"

您想要的匹配将在第 2 组中,而在第 1 组中的引用类型。

您的正则表达式中的缺陷是 1) 贪婪的“+”和 2) [A-Za-z0-9] 并没有真正匹配很多。许多字符不在该范围内。

【讨论】:

我认为您的意思是“\1”,而不是“$1”。 已经更正了。有时我会混淆正则表达式的方言,“$1”是 VBScript 正则表达式实现的反向引用。【参考方案3】:

它有效,但与引号中的其他字符不匹配(例如,非字母数字,如二进制或外语字符)。这个怎么样:

[\"']([^\"']*)[\"']

我的 C# 正则表达式有点生疏,如果不完全正确,请放轻松:)

【讨论】:

根本不返回任何匹配项。 我将其更改为使用括号而不是 [],因为我认为它将句点视为文字句点而不是通配符。我用你的示例字符串在 Ruby 中对其进行了测试,它似乎很好地匹配它们。 但是贪婪的开始会超过所有的引号,你会得到最长的匹配,但不是正确的匹配。 在这种情况下,第一个匹配项还包含我的测试字符串中的其余字符串 啊,我错过了那个。这个正则表达式似乎效果更好:只需捕获所有不是引用的内容【参考方案4】:
@"(\"|')(.*?)\1"

【讨论】:

【参考方案5】:

您可能已经拥有其中之一,但万一没有,这里有一个免费的开源工具,我一直使用它来测试我的正则表达式。我通常对表达式应该是什么样子有一个大致的了解,但需要摆弄一些细节。

http://renschler.net/RegexBuilder/

【讨论】:

以上是关于从报价中提取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从Yahoo Finance中解析类似JSON的数据?

1214:使用 COPY 命令将数据从 csv 导入 Redshift 时 CSV 的报价格式无效

ViewPager PagerAdapter with cursor - CursorLoader.onLoadFinished 不会被不同的查询调用

有趣的股票报价数据场景

如何在两个数据流PYTHON中连接图表和在线图表的报价?

数据建模草稿/报价/订单/发票