【问题标题】:Regex optional non-regex group match正则表达式可选的非正则表达式组匹配
【发布时间】:2012-03-12 16:48:48
【问题描述】:

假设我有以下输入:

Tonic,Love,(Original,Mix),house,dance,ton!c

这是我想要得到的规则:

  1. 所有逗号分隔单个关键字,除非 #2 为真。
  2. 圆括号之间的逗号无效。
    • 所有圆括号将关键字组合为一个关键字。

我现在有以下正则表达式:

#([\(?.*?\)])|(.*?),#

我最终得到这样的结果:

Tonic
Love
(Original
Mix)
house
dance

和用逗号分割一样,只是我丢失了最后一个关键字ton!c。我不要求这一切都发生在一个正则表达式中,但这是首选。

【问题讨论】:

  • 将正则表达式中的最后一个逗号替换为,|$,以免丢失最后一个值。
  • 你是不是也输了(Original,Mix),因为这需要基于#2 的 SINGLE 关键字?

标签: php regex csv


【解决方案1】:

这个简单的:\([^\)]*\)|[^,]* 应该可以工作。

【讨论】:

  • 这(几乎)完全符合我的需要。我唯一更改的是将最后一个 * 更改为 + 以删除空匹配项。
【解决方案2】:

你可以分开:

/,(?![^(]*\))/

或全部匹配:

/\([^)]*\)|[^,()]*/

至少对于你的例子。

即:

$array = preg_split('/,(?![^(]*\))/', $string);

【讨论】:

    【解决方案3】:

    试试

    "(\([^)]+\))|([^(][^,]*)(,(\([^)]+\))|([^(][^,]*))*"
    

    这会一次捕获所有组。

    【讨论】:

      猜你喜欢
      • 2020-06-24
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多