正则表达式。替换字符串中的特定字符

Regex. Replace particular characters in string

在下面的字符串中,我需要用点替换(仅使用正则表达式)所有 _,除了被数字包围的那些。所以这个:

_this_is_a_2_2_replacement_

应该变成

.this.is.a.2_2.replacement.

尝试了很多东西。这就是我到目前为止的进展:

([a-z]*(_)[a-z]*(_))*(?=\d_\d)...(_)\w*(_)

但是显然不行

尝试查找以下正则表达式模式:

(?<=\D)_|_(?=\D)

然后将其替换为点。这里的逻辑是,只要两边至少有一个非数字的下划线被点替换,就会发生替换。我在这里使用的正则表达式模式正是这样断言的:

(?<=\D)_    an underscore preceded by a non digit
|           OR
_(?=\D)     an underscore followed by a non digit

Demo

如果您使用的是 PCRE,您可以断言下划线左侧的数字并匹配后面的数字。然后使用 SKIP FAIL.

在替换中使用点:

(?<=\d)_\d(*SKIP)(*FAIL)|_
  • (?<=\d)正向后视,断言左边是数字
  • \d(*SKIP)(*FAIL) 消耗不应包含在匹配结果中的数字
  • |
  • _ 匹配单个下划线

Regex demo