使用包含句点的正则表达式提取子字符串

时间:2011-01-25 21:07:12

标签: regex

我这里有一个名单

apple.fruit
appleOrder2.fruit
orange.fruit

我想提取水果名称

预期

apple
apple
orange

我有正则表达式(.*)((Order)|(\.fruit))

从第一位返回,

apple
appleOrder2
orange

我认为\.搞乱了交替角色,因为当我使用

进行测试时
(.*)((Order)|(ge))

交替工作在第1位正常返回

empty
apple
oran

正在使用Perl

5 个答案:

答案 0 :(得分:1)

.*对你的正则表达式太贪心了。尝试:

(.+?)(?:Order2)?\.fruit

答案 1 :(得分:1)

使用延迟量词:

(.*?)(Order|\.fruit)

在你的正则表达式中,.*首先匹配整个字符串,然后一次回溯一个字符,直到交替Order|\.fruit匹配。由于在六次回溯之后已经出现这种情况,因此正则表达式引擎永远不会达到可能找到另一种早期替代品的程度。解决方案:通过向量词添加?,告诉正则表达式引擎尽可能少匹配字符。

答案 2 :(得分:0)

  

(* [^订购!?] | [^果!?])((令[0-9])|(.fruit)|((令[0-9])|(.fruit) ))

答案 3 :(得分:0)

在原始表达中:

(.*)((Order)|(\.fruit))

(Order)组不足以匹配第二个示例字符串的“Order2”组件。我想像是这样的东西:

(.*)((Order[0-9]?)|(\.fruit))

或类似的也可以匹配尾随整数(假设它并不总是“Order2”)。

答案 4 :(得分:0)

尝试^([a-z] )(\ n) [在(\ n)之后的asterix,在[a-z]]之后,它会从每一行中获取任何字符。更详细:“^([a-zA-Z0-9] )(\ n)