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,
,(?=[^)(]*\))