【问题标题】:Replace all occurrences of a character between two strings替换两个字符串之间所有出现的字符
【发布时间】:2020-06-16 21:07:20
【问题描述】:

我想使用 Notepad++ 在文本文档的所有行上用 _ 字符替换 string1string2 之间出现的所有空格。

例子:

string1 this is a first example string2
string1 this is a second example string2

预期结果:

string1_this_is_a_first_example_string2
string1_this_is_a_second_example_string2

我试过这个表达式(?<=string1)(\s*)(?=string2),但是没有用。

【问题讨论】:

  • Bilel,请提供string1 this is a string1 first example string2 字符串的预期输出。
  • yaeh 和 string1 this is a string2 first example string2 字符串的预期输出

标签: regex string replace find notepad++


【解决方案1】:

你可以使用

查找内容(?:\G(?!^)|string1)(?:(?!string1|string2).)*?\K\h(?=.*string2)
替换为_

请参阅regex demo

注意

  • 如果您只需要匹配常规空格,请将\h 替换为常规空格
  • \G(?!^(?<![\s\S])) 是对上一个成功匹配结束的更合适的检查,但如果您的预期匹配在单行上,您可以继续使用 \G(?!^)

详情

  • (?:\G(?!^)|string1) - 前一场比赛的结尾(但不是行首)或string1
  • (?:(?!string1|string2).)*? - 任何字符,0 次或多次,但越少越好,即不是开始 string1string2 字符序列
  • \K - 丢弃目前匹配的文本
  • \h - 任何水平空格
  • (?=.*string2) - 在任何 0 个或多个除换行符之外的字符之后必须有一个 string2,尽可能紧挨当前位置的右侧。

【讨论】:

  • 不起作用,错误匹配可以在这里看到regex101.com/r/AoWJkw/1regex
  • @Edward 这是正确的并且按预期工作,因为没有要求只匹配最近的string1string2 之间的空格。如果有这样的要求,我会发(?:\G(?!^)|string1)(?:(?!string1|string2).)*?\K\h(?=(?:(?!string1).)*?string2),见demo
  • 没有。如果最初的意图是通过string1s 来查找下一个字符串2,那么当(?:(?!string2).)*? 只需要这些时,您就不会将(?:(?!string1|string2).)*? 放入正则表达式中。
  • 在 yuor commnt 中提到的正则表达式案例和发布的正则表达式案例中,关闭结束检查实际上并没有在每次比赛结束后进行,因为它以指数方式太耗时。 nowdayz 的完成方式是在开始时,一次匹配第一个 string1
猜你喜欢
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2018-06-14
  • 2019-11-27
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多