Regular exp从匹配字符串开始,直到某个字符被满足

问题描述:

我有一些长字符串,我试图捕捉一个子字符串,直到某个字符被满足。 让我们假设我有下面的字符串,并且我想在第一个&符号之前得到文本。Regular exp从匹配字符串开始,直到某个字符被满足

abc.8965.aghtj&hgjkiyu5.8jfhsdj 

我想提取什么符号所以之前存在:abc.8965.aghtj W¯¯认为这会工作:

grep'^.*&{1}' 

我将它翻译为

^ start of string 
.* match whatever chars 
&{1} until the first ampersand is matched 

有什么建议吗? 恐怕这需要我数周

{1}不匹配的第一次出现;相反,它意味着“仅匹配前面的模式/字符之一”,这与匹配字符(&{3}匹配&&&)完全相同。

为了匹配的&第一发生,你需要使用.*?

grep'^.*?&' 

通常情况下,.*是贪婪的,这意味着它尽可能匹配。这意味着你的模式将与最后的和号相匹配,而不是第一个。 .*?是非贪婪版本,在满足模式的同时尽可能少地匹配。

更新:该语法可能不被grep支持。这里是另一种选择:

'^[^&]*&' 

它匹配任何不是&符号,直到第一个符号。

您还可能需要在grep中启用扩展正则表达式(-E)。

+0

的grep是不幸的是没有工作,我明白你的意思,虽然'^ *&? – JBoy 2013-03-04 13:47:20

+0

@JBoy,我对答案做了更新。 – 2013-03-04 13:54:05

试试这个:

^.*?(?=&) 

它不会得到符号标志,只是一个文本之前

+0

嗨塞尔吉奥,thx,但不幸的是这不是fetchin任何东西 – JBoy 2013-03-04 13:49:11

+0

看起来像你做的错误,我和dan1111都工作得很好,不同的是,我的跳过&签署 – Sergio 2013-03-04 13:50:37

+0

test =“abc.8965.aghtj&hgjkiyu5.8jfhsdj”echo $ {test} | grep'^。*?(?=&)' – JBoy 2013-03-04 13:51:49