2013-03-13 71 views
2

我有一个字符串匹配模式只有一次

foo-bar-bat.bla 

我想只匹配foo

我有缺陷的模式匹配都foobar

\w+(?=-.*\.bla) 

如何抛弃bar?或者甚至更好,我怎么能在foo之后停止匹配的东西?

+1

您可以停止第一场比赛后匹配(或者用'Matcher'或'replaceFirst'),还是我错过任何东西? – nhahtdh 2013-03-13 17:51:16

+0

我之前的评论是关于Java的,但我认为在其他语言中有相同的构造可以在第一场比赛中停止。我的评论不适用的唯一情况是当你使用某种工具时。但是,如果您提供更多示例和上下文,那么总会有一些变通方法。 – nhahtdh 2013-03-13 18:01:22

+1

foo和bar之间的关系是什么?酒吧需要在场吗? – 2013-03-13 18:01:49

回答

4

您可以使用下面的模式(只要你的字符串总是格式化你说的样子):

^\w+(?=-.*\.bla) 

Regular expression image

Edit live on Debuggex

^标志的开始处匹配串。因此将会取得字符串的第一个匹配。

?=旨在确保以下组未被捕获但存在。

+0

我不确定这个意图,但它不会匹配'[foo] bar-r.bla'中的任何内容,而问题中的正则表达式与我给出的例子相符。 – nhahtdh 2013-03-13 17:53:14

+0

@nhahtdh这是真的,但基于唯一的例子,我说我会说的会工作。尽管如你所说,视情况而定。 – 2013-03-13 17:54:32

+0

这种模式适用于我的python 2.7 web框架。也许我错误地使用了www.pythonregex.com,但由于某种原因,我在插入插入符号时无法获得任何结果。 – wawiwa 2013-03-14 20:06:54

0
^[^-]+ 

起始^装置开始从字符串的开头相匹配。字符组[^-]意味着搜索任何不是破折号的东西。 +表示该字符组应该一次或多次匹配一个字符。

+1

可能在网站上的python版本太旧,但这太过宽容。问题中的正则表达式只搜索单词字符'\ w'('[A-Za-z0-9_]'),而允许所有类型的字符匹配。 – nhahtdh 2013-03-13 17:56:40

+0

然后让它成为'^ \ w + -' – 2013-03-13 17:59:39

+1

@mrhobo,那么你不匹配文件扩展名 – 2013-03-13 18:01:42

0

表达式的“。*”部分与“bar”匹配。

^\w+(?=-.*)

该表达式读作“在一个字符串的开头,至少一个字符之后(但在比赛中没有includeded),其次是任何一个DASH”

^ \w+ (?=-.*) 
| | | 
| | matches "-bar-bat.bla" 
| matches "foo" 
start of string