正则表达式匹配第一次出现的字符串

22
我有这个字符串:

City - This is some text. This is some more - and continues here.

我想在第一个' - '处将该字符串分割,以找到'city'(仅为示例单词,也可以是其他单词)。另外,还要找到' - '后面的其余文本。
我构建了这个表达式:
(^[\D\W\S]*)( - )([\D\W\S]*)

但是这个方法找到的是最后一个 ' - ' 的位置,而不是第一个。

如何停止在第一个匹配的位置?


4
大多数编程语言都有将字符串按照指定字符分割的函数,并且可以限制分割次数。建议使用这样的函数来进行操作。如果您告诉我们您使用的是哪种语言,我们可以提供更多帮助。 - Felix Kling
这取决于正则表达式引擎。你在用什么? - Explosion Pills
6
各位,为什么要踩这个问题呢?这是一个公正的问题,他已经做了一些研究努力,并展示了他所尝试的。这比我们从大多数新来者那里得到的要多得多。因此,我作为用户1391459,欢迎您来到StackOverflow,并坚持下去!(另外,选择一个更好的用户名也是个好主意:)) - Tim Pietzcker
1
顺便问一下,你是怎么想到使用[\D\W\S]的?它的意思是“一个既不是数字也不是字母数字(因为字母数字已经包括了数字),也不是空白字符的字符”。因此,它匹配任何字符,在正则表达式中,这就是点(.:任何字符(除了换行符))的作用。除非你在使用JavaScript,否则如果没有选项允许你指定单行模式,你可能需要使用[\S\s],这样点就真的匹配任何字符了。 - Tim Pietzcker
我需要一个表达式来匹配Drupal Feeds xpath解析器中的某个文本。点号不够用,因为它还应该匹配换行符。由于我的测试,我这里错误地省略了它。[\S\s].不起作用。我现在实际使用[\D\W\S\n]。我发现对于PHP,替代方案是/(.)/sU,但在xpath解析器中不起作用。 - Gijs
显示剩余2条评论
1个回答

43

最简单的解决方案是明确禁止破折号成为第一组的一部分:

^([^-]*) - (.*)

说明:

^        # Start of string
([^-]*)  # Match any number of characters except dashes
\ - \    # Match a dash (surrounded by spaces)
(.*)     # Match anything that follows

然而,如果你的字符串 可能 在第一组中包含一个破折号(但不被空格所包围),这种方法就会失败。如果是这种情况,那么你可以使用懒惰量词:

^(.*?) - (.*)

解释:

^        # Start of string
(.*?)    # Match any number of characters, as few as possible
\ - \    # Match a dash (surrounded by spaces)
(.*)     # Match anything that follows

2
太完美了!感谢您的非常快速的回复。由于文本还包含换行符,并且末尾有一个数字应该被省略,这是可行的正则表达式:^(.?) - ([\D\W\S\n])\d{10}。 - Gijs
2
太好了,很高兴听到这个消息。但是你最好使用[\S\s]*而不是[\D\W\S\n]* - Tim Pietzcker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接