用于分割字符串的正则表达式在处理特殊字符时无法正常工作

时间:2018-02-16 18:12:20

标签: ruby regex split

我有一个regexp用逗号分割字符串,忽略单引号或双引号之间的逗号,给出以下Ruby代码:

def separate params
  params.split(?!\B('|")[^\"']*),(?![^\"']*('|")\B)
end

除了包含@#

等特殊字符的字符串外,它按预期工作

预期行为的示例:

https://regex101.com/r/xB7rQ7/156

"\"search\", placeholder: \"Busca rápida: 1.4 8V, Flex, automático...\", id: \"search_terms\" "

出现意外行为的示例:

https://regex101.com/r/xB7rQ7/157

"\"search\", placeholder: \"Busca rápida: 1.4 8V, Flex, automático...\", id: \"#search_terms\" "

请注意,唯一的区别是“search_terms”之前的#符号,但正则表达式仅在第一种情况下将placeholderid分开。

任何人都可以对我的正则表达式有所了解,以便它能在预期的两种情况下都能正常工作吗?请注意,这是关于字符串拆分的特定情况,但其他问题未涉及。

1 个答案:

答案 0 :(得分:0)

试试这个正则表达式:

,(?=(?:(?:[^"']*["']){2})*[^"']*$)

<强> Click for Demo

<强>解释

  • , - 匹配,
  • (?=(?:(?:[^"']*["']){2})*[^"']*$) - 确认上述,匹配必须遵循偶数"'的正面预测
    • (?:(?:[^"']*["']){2})* - 匹配"'后跟"'的任何字符的0次出现。最后的量词{2}重复此子序列2次。最后量词*重复整个子序列甚至次数(即0或2或4或6 ......次出现)。 如果"'同时出现在字符串
    • 中,则此子序列可能会有一些缺点
    • [^"']*$ - 在找到偶数次数后,在行结束前不应出现"'