【问题标题】:Insertion syntax for regex in Notepad++ or PerlNotepad++ 或 Perl 中正则表达式的插入语法
【发布时间】:2014-02-23 03:10:55
【问题描述】:

缩写:搜索: "{,[0-9][0-9]," 插入 Space+00... 得到替换的字符串段: "{,SPACE00[0-9][0-9]," 或找到的 [0-9][0-9] 序列的其他垃圾数据......那么我该如何搜索使用正则表达式并在中间插入???

长问题:

我正在尝试在一系列混合模型 CSV 分析数据中进行一系列简单的字符插入(实际上是数字)(五个文件,每个文件具有不同的模型参数,每个文件几百行)。

我在视觉上受到挑战,并希望插入填充字符来对数据进行排序,因此我可以专注于调整键值,而不是将数据文件保存到数据文件中。 这需要 CSV 数据行的格式是:

*Variable_symbolic-name*,{##,##,* ... ('CSV 数值数据列表集' ...},\n*

一条实际的数据线:

61,参数17,{,70,6,1,-1,3, 00,0,0,0,0,},,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

变形为:

61,参数17,\t\t{, 0070,6,1,-1,3, 00,0,0,0,0,},,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

给或取一个制表符以对齐所有 { 数字字段开始...

我发现搜索:"{,[0-9][0-9]," 失败但 "\{,[0-9][0-9] ,"搜索和替换 操作的查找部分 中成功...但是在如何执行实际操作时遇到了众所周知的难题替换(用插入) 这么短的长度。 (明明参数和文件这么多,我小心翼翼!)

但是,This Perl Help tutorial 让我不知道如何保留找到的范围并在之前插入填充(空格,零,如果是正则具体为零,如果为负,则为“-00”)简而言之,我需要知道如何在 Notepad++ 的替换字段中插入 2-3 个位置...并保留原始数据而不影响它!

这里的文章引用了替换段落和行,添加换行符等,但是这个简单的插入更改对你们来说似乎太简单了。但这对我来说已经沮丧了几个小时!

谢谢! // 弗兰克

已解决: 好消息:({,)([0-9][0-9],)\1 xx\2({, )(@[0-9][0-9],) 并替换为 \1 xx@\2 ...无论是否使用制表符。显然,关键是 ([0-9][0-9],) 其中包括逗号的区分......虽然我不知道为什么一个小时前它似乎失败了,并进行了试验在索布里尼奥的帮助下。一定没试过序列。谢谢大家!

【问题讨论】:

  • 在 Perl(以及几乎所有东西)中,{,[0-9][0-9], 匹配 {,25, 无需转义 {。在这种情况下,它不是 metachar。所以,我想知道你为什么说它“失败”。
  • 它失败了,因为它没有区分 {,25 和 {,2534,... 正如您在另一个线程中看到的那样,问题是位置歧视并用插入的子字符串替换找到的子字符串长度。尝试在 CSV 中创建具有可变左列长度的整齐列。 Tab 做了很多,但浪费了页面宽度。我可以忍受计算机输入流的速度比我能读的快,而且我们看到的只是几千字节文件中长度的 10% 的变化。文件最小长度可能是 4K 或更多,因此完全没有成本。谢谢!
  • 其实这值得更正。 Notepad++ 中的 '{' 设置一个数字计数,因此当启用正则表达式时,'\{' 是查找所必需的。 '{' 的其他搜索模式运行良好。 // 弗兰克
  • 我以为你在使用 Perl。不知道 Notepad++ 对正则表达式引擎使用什么,但如果它必须抖动 a{1,}a{,1} 之类的东西,它是一个糟糕的自定义字符选择。第一个是“a”的量词,第二个是字面量词。可能是旧的 BRE 之类的。

标签: regex insert insertion


【解决方案1】:

您需要在此处进行反向引用,这意味着在替换部分中将与您匹配的内容相同。

通常,整个匹配部分存储在$0 反向引用中。 (你也可以通过一个捕获组获得$1,最多可以通过两个捕获组获得$2,等等)

回到你的问题,你可以试试这个:

查找:

(\{,)([0-9][0-9],)

替换为:

\t\t$1 00$2

这将在匹配\{,[0-9][0-9],的部分之前插入两个制表符(或者换句话说,将匹配的部分替换为两个制表符和您匹配的部分),然后放置第一个捕获的部分({,)和然后是空格和双 0,然后是第二个捕获的部分,两位数和后面的逗号。

regex101 demo

【讨论】:

  • 这被标记为 Perl,$0 在 Perl 中不起作用。看我的回答。
  • @justintime 用户提到他在 Notepad++ 中这样做,它完全支持反向引用语法$0
  • 你们中的任何一个都可以翻译成我在 Lauro Wolff Valente Sobrinho 的回答中添加的内容。不知道他的\1、\2...和你的$1、$2...有什么区别...这些天我对软件一无所知。
  • (\{,)([0-9][0-9],) 这个嵌套可能会结出硕果...经过更多的尝试和错误后我会回来的。
  • @user3254047 \1 等价于$1。大多数语言正在从(旧的)反向引用语法从\1 转移到$1,并且在许多情况下,两者都受支持。至于你们的cmets,我觉得他们有点难以理解。您可以使用反引号 (`) 来格式化代码并防止样式降价。
【解决方案2】:

尝试在搜索框中输入:

(.+)(\{,[0-9][0-9].*)

在替换中:

\1\t\t\2

当括号之间有东西时,它们会被 Notepad++“存储”,并且可以在替换框中重复使用。

括号的顺序从一开始,访问方式为\1、\2、...

【讨论】:

  • 您的解决方案过于贪婪,未能在 ,{ 周围进行隔离,但是,(.+)(\{,)([0-9][0-9].*) \1\t\t\2 00\3 在短的第一个数字上工作正常,但在四位数的列数据上失败......让我玩更多。谢谢-让我偏离中心。
  • 好,很高兴您了解“保存”和“使用”的工作原理,现在您可能会自己解决! :)
  • 这个希望实际上失败了。您能否建议如何区分在三位和四位数字位置之前添加填充。如果我在 ',(4924,' 上执行此 SAR i> (.+)(\{,)+([0-9][0-9].) 仍在拾取 3 位和 4 位数字的行,并且需要对一位数字逗号进行类似的更改。看起来,位置计数并不是正则表达式解析的明显优势。
  • 好的,试试这个,搜索:^(.+)(\{,[0-9][0-9].*)$ 替换为:\1\t\t\ 2 ^ 匹配行首,而 $ 匹配行尾
  • 现在我真的很困惑。行首与数字数据的开始似乎没有区别。所以 \1 字段的结尾在所有情况下都是 ,{。搜索失败的是两个数字的位置计数,然后是逗号。第二个字段 ([0-9][0-9],) 不仅接##,还接### 和####。也许如果我在 ,{ 上添加了一个带有全局 SAR 的虚拟对象来填充一个无意义的分隔符,例如在数字之前获取 ,{,@ ?感谢帮助。不了解 $ 运算符。我的眼睛无法阅读......期间,所以这真的很好。我已经 20 年没有编程了,所以这是一个艰难的雪橇。
【解决方案3】:

您将其标记为 Perl,所以这是您在 Perl 中的操作方式...

我更喜欢使用前瞻断言而不是反向引用

s/(?= {,[0-9][0-9], ) /\t\t/x

或者,$& 包含匹配的字符串($0 是不同的)

s/ {,[0-9][0-9],  /\t\t$&/x

【讨论】:

  • 我使用了 Perl,因为它不允许我使用标签 'regex-insertion' ...我没有足够高的评分,因为我没有认真编程,因为我没有认真编程九十年代初。如果你们能如与 Lauro Wolff Valente Sobrinho 讨论的那样,对如何隔离前后子串有所了解,我真的可以使用修复。我想我在三个多小时前打开了这些文件!感谢这位老硬件工程师。弗兰克!
猜你喜欢
  • 1970-01-01
  • 2011-03-22
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多