Regex 正则表达式-仅使用正则表达式引擎是否可以进行递归替换?条件搜索替换

Regex 正则表达式-仅使用正则表达式引擎是否可以进行递归替换?条件搜索替换,regex,recursion,Regex,Recursion,我正在编辑一些数据,我的最终目标是有条件地将,(逗号)字符替换为,(点)。我现在有一个粗略的解决方案,所以这个问题严格来说是为了在实践中提供更好的方法的建议,并确定在增强的编程环境之外使用正则表达式引擎可以实现什么 我在大学里做了一次很好的尝试,但是6个小时对于一个星期六来说已经足够了,我已经认输了 我已经浏览了大约40篇关于regex递归、替换等的帖子,wiki.org上关于regex和正则语言的定义和历史,以及其他一些教程网站。大多数是以Python和PHP为中心的 工作、原始正则表达式(便

我正在编辑一些数据,我的最终目标是有条件地将
(逗号)字符替换为
(点)。我现在有一个粗略的解决方案,所以这个问题严格来说是为了在实践中提供更好的方法的建议,并确定在增强的编程环境之外使用正则表达式引擎可以实现什么

我在大学里做了一次很好的尝试,但是6个小时对于一个星期六来说已经足够了,我已经认输了

我已经浏览了大约40篇关于regex递归、替换等的帖子,wiki.org上关于regex和正则语言的定义和历史,以及其他一些教程网站。大多数是以Python和PHP为中心的

工作、原始正则表达式(便于循环/手动搜索和替换):

以及所需的输出:

room_ass=01: macro_id=01: name=Left, pgm_audio=0, usb=0, list=(1*.3.5.7.),
room_ass=01: macro_id=02: name=Right, pgm_audio=1, usb=1, list=(2*.4.6.8.),
room_ass=01: macro_id=03: name=All, pgm_audio=1, list=(1.2*.3.4.5.6.7.8.),
就这些。只需将
替换为
,但只能在
()
内部

这是我想看到的一种概念性(不起作用)方法,中间组将递归循环:

(^.*)(?<=\()([^,]*)([,|\d|\*]\3.*)(?=\))(.*$)
                   (          ^  )      
或 一个简单得多的方法是告诉它屏蔽/选择所有
,在
()
之间,但我突然想出了一个办法。 我经常使用文本编辑器来完成像这样的小数据编辑任务,所以在深入研究Python之前,我想验证一下SublimateText不能完成这项任务


欢迎所有建议和批评。温柔点 这是一个完全的猜测,因为我没有使用SublimiteText,这里的假设是SublimiteText使用PCRE正则表达式

请注意,您提到“递归”,我不相信您的意思是这不适合这里的问题

像这样的东西可能有用。。。 您需要进行测试,以确保它与文档中的其他内容不匹配,并查看SublimateText是否支持此功能

这是基于使用
/K
运算符“保留”前面的内容-您可以找到它的其他用途,作为PCRE不支持的变量外观落后的PCRE替代(解决方法)

正则表达式 想象

正则表达式描述
  • 匹配左括号字符
    \(
  • 匹配下面的正则表达式
    (?:(?:[^,\)]+,)*?
    • 在零次和无限次之间,尽可能少地按需扩展(惰性)
      *?
    • 匹配下面的正则表达式
      (?:[^,\)]+)
      • 匹配以下列表中不存在的任何单个字符
        [^,\)]+
        • 在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)
          +
        • 文字字符“,”
        • 右括号字符
          \)
    • 匹配字符“,”字面上的
  • 匹配下面的正则表达式
    (?:[^,\)]+)
    • 匹配以下列表中不存在的任何单个字符
      [^,\)]+
      • 在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)
        +
      • 文字字符“,”
      • 右括号字符
        \)
  • 使文本在整个正则表达式匹配中保持匹配
    \K
  • 匹配字符“,”字面上的

    • 不需要太多魔法。只要检查一下,如果中间有一个结束(

      ,(?=[^)(]*\))
      


      但是,它不会检查开口
      。这是一种常见的方法,可能是一种无聊的方法。

      谢谢Dean!这现在更有意义了。你的正则表达式确实成功地发现了第一个“,”而没有突出显示任何其他内容。我希望我能够使用递归让引擎继续扫描目标数据,并一次性选择所有括号之间的逗号,将每个逗号添加到一个捕获组中,就像跟踪数组中的字符一样。反向引用现在似乎是更可能的工具,但可能仍然不适合我想象的行为。完美,简单得令人痛苦。谢谢,这正是我需要的。
      (^.*)(?<=\()([^,]*)([,|\d|\*]\3.*)(?=\))(.*$)
                         (          ^  )      
      
      room_ass=01:macro_id=01: name=Left, pgm_audio=0, usb=0, list=(1*,3,5,7,),
                                                            iter 1-|  ^      |
                                                                 2-|    ^    |
                                                                 3-|      ^  |
                                                                 4-|        ^|
      
      \((?:(?:[^,\)]+),)*?(?:[^,\)]+)\K,
      
      ,(?=[^)(]*\))