【问题标题】:regex to find number preceded and followed by different strings正则表达式查找不同字符串前后的数字
【发布时间】:2012-10-14 15:23:27
【问题描述】:

我有一个包含文本和数字的文本文件,例如:

MANGO444CHERRYa.b /c-1@2#3APPLEa>b;c. a1$2$3WHITE12 3ab cWHITE5%6^7a=b +cWHITEaba5b6a7baMANGO555CHERRY 1'2'3a,b,c!APPPLE1`2~3ab @cYELLOW123---a- -bcYELLOW

我需要在APPLEWHITE 之前获得MANGOCHERRY 之间的号码(在本例中为444)。大写单词之间的文本可以是任何内容。我试过这个:

(?<=MANGO)\d+((=?.*?APPLE)(=?.*?WHITE))  

但它会返回:

444CHERRYa.b /c-1@2#3APPLEB>b;c. a1$2$3WHITE

我希望这能更好地说明问题

【问题讨论】:

  • 在您的示例中,没有 ID 后跟黑色。请编辑您的问题,提供更好的解释和输出示例。
  • 也许从简单的解决方案 MANGO([0-9]+)BLACK.* 开始,并解释为什么它不起作用。
  • 上述解决方案不起作用,因为除了 之外,MANGO 和 BLACK 之间的数字是数字,并且 后跟 BLACK,仅在一些文本之后。例如:123abcMANGO123abcAPPLE123abcBLACK
  • 在您的示例中,将“一些文本字母数字、数字和非字母数字字符”更改为(例如)“文本、数字和非字母数字”,或者每行中的不同代表字符串,以减少你的问题中没有信息的部分;而不是 显示不同的数字。此外,如果 MANGO、APPLE 和 BLACK 可以出现在同一行,请修复问题中的示例以显示它。此外,如果您在 grep 的正则表达式中使用锚点,请使用 -P 开关

标签: regex bash match


【解决方案1】:

这可能有效。不过我正在使用 sed。

sed -nr 's/.*MANGO([0-9]+).*APPLE.*WHITE.*/\1/p' yourfile

已编辑以检查 MANGO 和 WHITE 之间的 APPLE。

限制:仅当 MANGO-APPLE-WHITE 在该行中仅出现一次时才有效。

如果没有 -n 选项和 p 标志,sed 将在未找到匹配项时简单地打印出该行。

【讨论】:

  • 太棒了!!但是苹果呢?我想我没有正确解释问题(再次):((抱歉)我需要匹配 APPLE 和 WHITE,或 APPLE 和 YELLOW,具体取决于 sed 配置。这是因为稍后在文本中 APPLE 将变为 ORANGE 和我不想要橙色后面的数字
  • 再次编辑...我认为这适用于您的情况,假设 MANGO...APPLE...WHITE 组合仅在该行中出现一次。
  • 对,差不多了 :) 这适用于 MANGO444CHERRY--ORANGE--WHITE--WHITE--MANGO555CHERRY--ORANGE--BLACK--BLACK > 如果我搜索 MANGO..ORANGE.. WHITE 我得到 444(好!)如果是 MANGO..ORANGE..BLACK 我得到 555(好!)但是如果我有 MANGO..APPLE..WHITE 我得到整条线(不好,在这种情况下我需要命令什么都不返回)
  • 只是为了澄清上述 - [MANGO..APPLE..WHITE] 表示不是 MANGO..ORANGE..SOMETHING
  • 好的,我明白了问题所在。添加-n 选项和p 标志应该可以解决这个问题。
【解决方案2】:

如果您需要捕捉MANGOBLACKAPPLE 之间的小数组:

etuardu@subranu:~$ echo '
> MANGO0012BLACK
> MANGO0045txt
> MANGO2314APPLE
> txt00313BLACK' | grep -Po '(?<=MANGO)\d+(?=BLACK|APPLE)'
0012
2314

【讨论】:

  • 谢谢你的帮助!,我需要黑色和苹果。请查看已编辑的问题
猜你喜欢
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多