【问题标题】:JS Regex: How to replace lines of text within a specific area?JS Regex:如何替换特定区域内的文本行?
【发布时间】:2015-03-11 07:32:15
【问题描述】:

做一些文本操作,我需要一个正则表达式,它会在下面的文本的第一组中找到每个缩进的行,但不是第二组:

First group of lines are below:
- line 1
- line 2
- line 3

Second group of lines are below:
- line 1
- line 2
- line 3

例如,我想在数字前插入一个“A”,但只在第一组。所以我得到:

- line A1
- line A2
- line A3

但同样在第一组中,即使第二组的行是相同的。只需执行.replace(/^(- \w+ )(\d)/,'\1A\2' 将在 all 行上执行替换,但我不知道如何将其限制为仅第一组。

Javascript(或任何其他风格)正则表达式能够做到这一点吗?也就是说,只有在集合前面有一个“定义”匹配时才对一组连续匹配进行操作?

【问题讨论】:

  • 我认为你需要改变解决问题的方法,并提出一个问题:每个组有什么不同? ,也许尝试将“组”作为参数作为通用函数可以提供帮助
  • 在 JavaScript 中,您不支持后视。在 C# 中,您可以使用此正则表达式: (?myregextester.com/?r=cee4c867。要使其在 JavaScript 中工作,您必须尝试后视转换。看看stackoverflow.com/questions/641407/… [Javascript:消极的后视等效?]
  • 谢谢你的回答,我知道它可以用代码完成,但我特别想知道它是否可以单独使用正则表达式来实现。

标签: javascript regex


【解决方案1】:

首先提取适合替换的文本部分:

 var a_parts
   , s_orig
   , s_final
   , s_sep
   ;

 s_orig = <from_whatever_source>;
 s_sep  = "Second group of lines are below:"; 
 a_parts = s_orig.split(s_sep);
     // Substitute on a_parts[0], leave a_parts[1] untouched.
 s_final =
     a_parts[0].replace(/^(- \w+ )(\d)(.*)/g,'\1A\2')
   + s_sep
   + a_parts[1]
 ;

该方法以直接的方式推广到要区别对待的更多部分。请注意,.split 的参数可能是正则表达式,因此您可以指定节分隔符的交替。

这有点类似于“定义匹配”的概念,引入(通常:分隔)原始字符串的相关部分。

【讨论】:

  • 有趣的编码风格。
猜你喜欢
  • 1970-01-01
  • 2012-07-19
  • 2020-02-24
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多