【问题标题】:Regex Capture Group substring正则表达式捕获组子字符串
【发布时间】:2016-12-15 20:08:57
【问题描述】:

尝试在Notepad++ 中使用正则表达式。我希望发生以下情况:

名字:乔纳森

替换为:

名字:乔娜

我尝试了以下方法:

查找语句

名字:(.*)

替换语句:

名字:\1

为了将其放入捕获的组中。但现在我需要捕获的组是truncated/substring,所以它只是前 四个 字符。当我进行替换时,它会很好地替换整个字符串,但我不清楚如何只获取捕获组的前四个字符。我试过(.*){4},但什么也没返回。

谢谢!

【问题讨论】:

    标签: regex replace find notepad++ substring


    【解决方案1】:

    这种模式只会打扰处理过长的行来截断。

    我的模式不仅在步数/效率方面优于其他答案,而且它也不会打扰替换字段中的任何引用或文本。

    使用这个:(Pattern Demo)

    查找:FirstName: .{4}\K.+
    替换:[无]

    *注意,\K 表示“从这一点开始匹配”。 .+ 将停在每一行的末尾。

    【讨论】:

      【解决方案2】:

      如果它在行的开头并且是面向行的,
      或唯一的行项目,这将起作用。

      查找:(?im)^[^\S\r\n]*(firstname:)[^\S\r\n]*([a-z]{0,4}|.{0,4}).*
      替换:FirstName $1

      如果它在字符串的中间,则需要更多的努力。
      必须看到一些例子,因为必须使用伪锚。

      【讨论】:

        【解决方案3】:

        我不确定是否有办法只访问匹配组的一部分,但您可以只匹配所需的部分。

        您的新 find 语句将仅捕获前 4 个字符,但仍与其余字符匹配:

        FirstName: (.{4}).*?$
        

        意思是“找到字符串'FirstName:',然后记住接下来的四个字符,然后一直到行尾。”

        您的替换语句将与以前几乎相同(我在 FirstName 后面加了一个空格):

        FirstName: \1
        

        【讨论】:

        • 注意,如果"FirstName:"后面的字符少于4个,那么这个正则表达式将不匹配,将被完全忽略,这与捕获(.{1,4})并重新插入它是一样的.事实上,.*? 可以替换为.+?,并且在“FirstName:”之后恰好有 4 个字符的示例也将被忽略。但对于大多数情况(除非不区分大小写和其他怪异),这些都是等价的。
        【解决方案4】:

        这里有一个方法:

        • 查找内容:(FirstName:.{1,4}).*?$
        • 替换为:$1

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-20
          • 2014-10-13
          • 1970-01-01
          • 2015-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多