【发布时间】: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
我需要在APPLE 和WHITE 之前获得MANGO 和CHERRY 之间的号码(在本例中为444)。大写单词之间的文本可以是任何内容。我试过这个:
(?<=MANGO)\d+((=?.*?APPLE)(=?.*?WHITE))
但它会返回:
444CHERRYa.b /c-1@2#3APPLEB>b;c. a1$2$3WHITE
我希望这能更好地说明问题
【问题讨论】:
-
在您的示例中,没有 ID 后跟黑色。请编辑您的问题,提供更好的解释和输出示例。
-
也许从简单的解决方案
MANGO([0-9]+)BLACK.*开始,并解释为什么它不起作用。 -
上述解决方案不起作用,因为除了
之外,MANGO 和 BLACK 之间的数字是数字,并且 后跟 BLACK,仅在一些文本之后。例如:123abcMANGO 123abcAPPLE123abcBLACK -
在您的示例中,将“一些文本字母数字、数字和非字母数字字符”更改为(例如)“文本、数字和非字母数字”,或者每行中的不同代表字符串,以减少你的问题中没有信息的部分;而不是
显示不同的数字。此外,如果 MANGO、APPLE 和 BLACK 可以出现在同一行,请修复问题中的示例以显示它。此外,如果您在 grep 的正则表达式中使用锚点,请使用 -P 开关