正则表达式。替换字符串中的特定字符
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
如果您使用的是 PCRE,您可以断言下划线左侧的数字并匹配后面的数字。然后使用 SKIP FAIL.
在替换中使用点:
(?<=\d)_\d(*SKIP)(*FAIL)|_
(?<=\d)
正向后视,断言左边是数字
\d(*SKIP)(*FAIL)
消耗不应包含在匹配结果中的数字
|
或
_
匹配单个下划线
在下面的字符串中,我需要用点替换(仅使用正则表达式)所有 _,除了被数字包围的那些。所以这个:
_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
如果您使用的是 PCRE,您可以断言下划线左侧的数字并匹配后面的数字。然后使用 SKIP FAIL.
在替换中使用点:
(?<=\d)_\d(*SKIP)(*FAIL)|_
(?<=\d)
正向后视,断言左边是数字\d(*SKIP)(*FAIL)
消耗不应包含在匹配结果中的数字|
或_
匹配单个下划线