如何使用Perl剪切字符串的一部分?

如何使用Perl剪切字符串的一部分?,perl,Perl,我需要从字符串中间剪下一些字符;要剪切的字符序列的起始和结束位置将有所不同 例如,假设我有这个句子 那只敏捷的棕色狐狸跳过了那只懒狗 我需要从第一个字符开始向前计数,直到到达fox,将f的字符位置分配给一个变量,继续向前计数,直到到达“the”,然后剪切掉包含初始f和最终e之间的字符 笔记 在fox和之间有一个e,应该忽略,它必须找到e在中的位置。要删除字符串中不确定所有插入字符的部分,可以使用。如果存在匹配项,则匹配项零索引的开始位置存储在$LAST_match_START[0]中(如果使用英

我需要从字符串中间剪下一些字符;要剪切的字符序列的起始和结束位置将有所不同

例如,假设我有这个句子

那只敏捷的棕色狐狸跳过了那只懒狗

我需要从第一个字符开始向前计数,直到到达fox,将f的字符位置分配给一个变量,继续向前计数,直到到达“the”,然后剪切掉包含初始f和最终e之间的字符

笔记
在fox和之间有一个e,应该忽略,它必须找到e在中的位置。

要删除字符串中不确定所有插入字符的部分,可以使用。如果存在匹配项,则匹配项零索引的开始位置存储在$LAST_match_START[0]中(如果使用英语;)

输出: 在字符16处匹配 新串:敏捷的棕色懒狗 哪一个? 请注意,我使用的正则表达式是贪婪的,所以它会在最后一个正则表达式中吞噬每一个正则表达式。对于字符串:

那只敏捷的棕色狐狸跳过了懒惰的狗和困倦的猫 您将获得:

在字符16处匹配 新串:敏捷的棕色睡猫 要在第一次出现时停止,请将替换更改为:

s/fox.*?the//;
s/(?:^|\s+)\Kfox\s+.*\s+the(?=\s+|\z)//; # greedy
只字片语 上面的两个正则表达式仍将匹配部分单词。字符串:

那个敏捷的棕色散兵坑跳过了他们的懒狗 给出:

在字符16处匹配 新串:敏捷的棕色懒狗 若要仅匹配整词*,请将替换更改为:

s/fox.*?the//;
s/(?:^|\s+)\Kfox\s+.*\s+the(?=\s+|\z)//; # greedy

*在英语句子中,很难定义什么是一个完整的单词。上面所说的是一个单词的两边都被一个或多个空格包围,或者位于字符串的开头或结尾,这就排除了已知的内容,但也排除了fox和The,。这显然不是一个很好的定义

我有这个句子

那只敏捷的棕色狐狸跳过了那只懒狗

我需要从第一个字符开始向前计数,直到到达“fox”,将“f”的字符位置指定给一个变量,继续向前计数,直到到达“the”,然后剪切字符,包括“f”和“e”之间的字符

我引用您的问题描述是因为它表明了您对待Perl的C心态。在比C更高一点的层次上,你的问题是要切掉brown和lazy之间的单词。Perl允许您直接表达这一想法:

$ perl -wE 'say join(" ", (split /\s+(?:fox|the)\s+/, "The quick brown fox jumped over the lazy dog")[0, 2])' The quick brown lazy dog 或者,使用范围操作符:

$ perl -wE 'say join " ", grep !(/^fox$/ .. /^the$/), split " ", "The quick brown fox jumped over the lazy dog"' The quick brown lazy dog 它的字面意思是,把所有不在“fox”和“the”之间的单词,用一个空格作为单词分隔符,把它们连接在一起,然后打印出结果句子

如果原来的句子有很多很多单词,第一个可能会更有效,因为它只会创建一个三元素列表


您可以在perldoc perlop中阅读更多有关该项目的信息。由于您刚刚开始学习Perl,您应该至少阅读一次perldoc perltoc中提到的所有内容,包括所有常见问题解答部分。

通常,您会提供证据证明您自己已经尝试解决了这个问题。我是Perl新手。我发现的所有研究都与使用长度有关,据我所知,长度不能在字符串中使用。因此,我不知道该做什么,来到一个知识库,请随意投反对票。谢谢你,这会帮助很多人记住,有时候。@SinanÜnür,谢谢你提醒我。用正则表达式解析自然语言单词很容易出错,这是徒劳的练习或类似的练习。。。举个例子,我的前一句话:美好的解决X而不是Y的方法。我认为这些可能更接近OP真正想要的。