regex 如何使用正则表达式从字符串中删除2个元素?

ndh0cuux  于 2023-03-04  发布在  其他
关注(0)|答案(4)|浏览(145)

老实说,我可以每天都用regex,但还是不懂。对不起!
我有一组字符串:

Product Title 1 10xx 40.5%
Product Title 2 40x 40.655%
Product Title 30xx 51%

如何删除最后两个文本块(如果我使用"空格"作为分隔符,则总是需要删除最后两个文本块)?最终结果将是:

Product Title 1
Product Title 2
Product Title

等等。

von4xj4u

von4xj4u1#

不需要正则表达式,awk更适合这里:

$ awk 'NF-=2' file
Product Title 1  
Product Title 2  
Product Title
sqougxex

sqougxex2#

使用多行选项,您可以 * 锚定 * 搜索到每行$的 * 结尾
然后:

/[ ]*\S+[ ]+\S+[ ]*$/gm

用空字符串替换
https://regex101.com/r/HqoV9K/1

6qqygrtg

6qqygrtg3#

我相信其他一些对正则表达式了解最多的人能够写出更好的模式,但我的尝试是:

\d+x+\s(\d+|\d+\.\d+)\%$

Regex fiddle

xe55xuns

xe55xuns4#

通过匹配以下正则表达式,您可能更愿意保留所需的部分,而不是删除不需要的部分。

.*(?=(?:\s\S+){2}$)

这个表达式可以分解如下。

.*       match zero or more characters other than line terminators
(?=      begin a positive lookahead
  (?:    begin a non-capture group
    \s   match one whitespace character
    \S+  match one or more non-whitespace characters
  ){2}   end the non-capture group and execute it twice
  $      match the end of the string
)        end the positive lookahead

这里假设regex引擎支持lookaheads(大多数都支持)。
如果可以有多个空格分隔“字段”,则需要稍微调整:

.*\S(?=(?:\s+\S+){2}$)

这Assert要匹配的字符串以非空白字符结尾。但是,它假定要返回的字符串不为空。如果要返回的字符串可能为空,则可以使用 negative lookbehind(如果regex引擎支持)。

.*(?<!\s)(?=(?:\s+\S+){2}$)

负lookbehind (?<!\s)Assert空格字符不能位于后面的匹配项之前,该匹配项以空格字符开始。
如果空格实际上必须是常规空格,则应使用空格字符代替\s。例如,

.*\S(?=(?: +\S+){2}$)

Demo

相关问题