如何在括号内用逗号分隔字符串,而不是用双引号

时间:2015-05-22 07:34:22

标签: c# regex

如何使用Regex捕获样本字符串上的所有参数?我尝试在https://regex101.com/上使用(\ @ \ w + | \ w +)模式,但它返回样本字符串上的所有单词,这不是我所期望的。

.selector(@background, height, font "font-family, font family", @width : 10px, "red");

expected output should capture 5 parameters:

 1. @background
 2. height
 3. font "font-family, font family"
 4. @width : 10px
 5. "red"

我在结合正则表达方面遇到了困难,我花了一个小时来弄清楚这就是为什么我决定寻求帮助。

3 个答案:

答案 0 :(得分:2)

首先,我会在括号之间提取有趣的部分,然后我会读取内部参数:

var args = str.match(/\(([^\)]+)\)/)[1].match(/[^,"]+("[^"]+")*/g)

结果:

enter image description here

第二部分([^,"]+("[^"]+")*)的想法是明确地在引号之间包含部分。

答案 1 :(得分:0)

^.*?\(|,(?=(?:[^"]*"[^"]*")*[^"]*$)|\).*$

您可以按此拆分并从结果中删除empty string。参见演示。

https://regex101.com/r/nD5jY4/6

答案 2 :(得分:0)

这是一个一体的正则表达式:

/(?<=[,\(])(?:\s*)([^,"]*(?<dq>")?(?(dq)[^"]+"[^\(\),]*))(?:\s*)/g

说明:

  • 参数是逗号或开头括号后的参数 - &gt;通过积极的后视(?<=[,\(])
  • 来控制这一点
  • 匹配,但不要采取任何额外的空白 - &gt;在资本营养组之外(?:\s*)(更好)。
  • 在捕获组中:
    • 首先匹配除逗号和双引号之外的任何内容。
    • 如果遇到双引号,则匹配任何内容,直到匹配另一个双引号。

https://regex101.com/r/pC9fB6/1结果。

注意:在所有正则表达式引擎(例如JavaScript)不支持后面的注释背后的注释中发现了破坏性。一种可能的解决方案是将lookbehind断言的字符类[,\(]放在非捕获的空白组中:(?:[,\(]\s*)。结果几乎相同,编号捕获的匹配完全相同。