我有一个包含一堆句子的文本文件。句子包含空格(空格、制表符、换行符)以分隔由字母和/或数字组成的单词。
我想找到单词“123”或“-123”并在数字开始前插入一个点 (.)。因此,所有出现的“123”和“-123”都将转换为“.123”和“-.123”。
我正在尝试使用以下方法:
$line =~ s/(\s+-*123\s+)/getNewWord($1)/ge
其中 $line 包含从文件中读取的一行,函数 getNewWord word 会将点 (.) 放在匹配单词中的适当位置。
但它不适用于有两个连续的“123”(如“123 123”)的情况。由于第一个“123”被“.123”替换,单词后面的空格已经匹配,第二个“123”不匹配,因为正则表达式引擎无法将前面的空格与该单词匹配。
谁能帮我这个?谢谢!
最佳答案
我同意 MRAB(并为他/她的回答加了 1),但实际上并不需要 getNewWord
函数。我会将整个语句更改为以下内容之一:
$line =~ s/((?:^|\s)-?)(123)(?=\s|$)/$1.$2/g;
$line =~ s/(?:^|(?<=\s))(-?)(123)(?=\s|$)/$1.$2/g;
$line =~ s/(?:^|(?<=\s)|(?<=\s-))(?=123(?:\s|$))/./g;
关于regex - 使用 Perl 正则表达式重叠文本替换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8900725/