【发布时间】:2014-03-30 10:30:37
【问题描述】:
我正在尝试用“#”替换字符串中的所有数字,前提是它们没有特定的前缀。 这些数字可以作为单词的一部分出现,也可以单独作为单词出现。
例如,使用 ABC 作为前缀,这是想要的结果。
输入:
sdkfjsd 12312981 sdkfjsdfhbnmawd 1298 ,smdfsdnfk2342423
sdlkfsdfs 20349 ABC1203912 2034234aac <-- ABC<number> stays, the other numbers do not
ABC1203912
结果(注意第 2,3 行的 ABC 带有一个数字):
sdkfjsd # sdkfjsdfhbnmawd # ,smdfsdnfk#
sdlkfsdfs # ABC1203912 #aac <-- ABC<number> stays, the other numbers do not
ABC1203912
我试图用正则表达式后面的负面外观来做到这一点:s/(?<!ABC)\d+/#/g。
在这种情况下,只有 ABC 之后的第一个数字不会被替换,其余的都会。
我的下一步是将字符串拆分为包含 ABC\d+ 的部分,并对其他部分执行简单的替换。
将不胜感激任何建议如何在不拆分成多个字符串的情况下完成整个事情。
谢谢!
编辑 1:将 aac 移回正确位置。 编辑 2:我正在使用 perl 5.8.5,以防万一。由于与我无法控制的代码的兼容性问题,我无法更新到较新的版本。
【问题讨论】:
-
我不明白您所说的“我的下一步是将字符串拆分为包含
ABC\d+的部分,并对其他部分执行简单替换。”,但您可以替换like so。 -
您的结果与您的输入不匹配,您将
aac字段向上移动。 -
@TLP - 谢谢。固定:)
-
@Jerry - 如果我找不到使用否定查看或其他任何方法的方法,我将求助于拆分字符串并处理子字符串,这将更易于解析。也欣赏这个例子,但在 Perl 中否定的外观必须是固定宽度,这样就不会运行。
-
@Oron 啊,我现在明白了。是的,TLP 早些时候提到过。 PCRE 代表 Perl Compatible RegEx,我认为它会起作用。不过这没什么大不了的,我把解决方法放在我的答案中。
标签: regex perl negative-lookbehind