gpt4 book ai didi

regex - Perl,删除前三个字符后的所有内容

转载 作者:行者123 更新时间:2023-12-04 15:26:53 25 4
gpt4 key购买 nike

我向你们保证,我已经在网站上搜索了大约两个小时。我发现了几个应该有效的方法,但它们没有。

我有一行由由空格分隔的不同数量的数字组成。我想删除第三个数字之后的所有内容。

我应该说,我写的所有内容都是假设 \S\s\S\s\S 与前三个数字匹配。 1 和 2 以及 2 和 3 之间有空格。

我预计会有以下工作:

s/^.*?[\S\s\S\s\S].{5}//s;

但这与我想要的完全相反。

我希望 2 3 0 4 5 6 7 1 0 1 2 变成 2 3 0

我真的更愿意保留它的替代品。正如一个人提到的那样,我试过向后看,但我没有运气。在尝试这些命令之前,我是否应该将前 3 个数字保存为字符串?

编辑:

我应该澄清一下,这些数字也可以采用 1.57 或 1.00E01 的形式。当我试图让它成为基线工作时,我有整数。

最佳答案

\S\s\S\s\S确实会匹配三个由空格字符分隔的非空格字符。然而,^.*?[\S\s\S\s\S].{5}做一些完全不同的事情:

  • ^匹配行的开头。
  • .*?匹配字符直到下一个匹配开始(不要尽可能多)。由于您指定 /s , .也将匹配换行符。
  • [\S\s\S\s\S]是一个字符类,所以与[\S\s]相同—匹配 \S\s ,也就是说什么。
  • .{5}将匹配五个字符。

[\S\s]./s匹配相同的东西,.*?永远不会匹配任何字符,因为它希望尽可能少地匹配。因此,这与 s/^.{6}//s 相同——删除字符串的前六个字符。如您所见,这不是您想要的!

保留前三个数字的一​​种方法是显式匹配它们:s/^(\d \d \d).*/$1/s .在这里,\d匹配单个数字 ( 09 ),它们之间有文字空格。我们匹配前三个,然后匹配任何内容,然后替换整个匹配项——因为它以 .* 结尾。 ,这是整个字符串——只有括号之间的位,前三个数字。如果您的号码可以超过一位数,则 s/^(\d+ \d+ \d+).*/$1/s会做你想做的事;如果你可以用任意类似空格的字符(空格、制表符、换行符)分隔它们,那么 s/^(\d\s\d\s\d\s).*/$1/s是你想要的(或者 \s+ 如果你可以有多个空格)。如果你想捕获除数字以外的行,你可以使用 \S\S+ ,就像你一样。

另一种使用后视的方法是 s/(?<=^\d \d \d).*//s .换句话说,删除所有以 ^\d \d \d 开头的字符。 — 字符串的开头,后跟三个以空格分隔的数字。这种方法没有真正的优势——我可能会用另一种方法来做——但既然你提到了后视,那么你可以这样做。 (同样,像 s/(?<=^\S\s\S\s\S).*//s 这样的东西更通用。)

关于regex - Perl,删除前三个字符后的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11870230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com