【问题标题】:Regex to match the first occurrence of a string正则表达式匹配字符串的第一次出现
【发布时间】:2012-05-12 20:38:11
【问题描述】:

我有这个字符串:

城市 - 这是一些文字。还有一些 - 并在此处继续。

我想在第一个'-'处拆分字符串以找到'city'(只是一个示例词,也可以是其他词)。加上查找' - '之后的其余文本。

我构造了这个表达式:

(^[\D\W\S]*)( - )([\D\W\S]*)

但这会找到最后一次出现的 ' - ' 而不是第一个。

如何在第一次出现时停止?

【问题讨论】:

  • 大多数语言都有按特定字符分割字符串的功能,甚至可以限制分割次数。你应该使用这样的功能。如果您让我们知道您使用的是哪种语言,我们可以为您提供更多帮助。
  • 这取决于正则表达式引擎。你在用什么?
  • 来吧伙计们,为什么要否决这个?这是一个公平的问题,他确实投入了一些研究工作,并展示了他的尝试。这比我们从大多数新人那里得到的要多得多。所以,来自我,user1391459,欢迎来到 StackOverflow,并坚持下去! (另外,选择一个更好的用户名也是一个好主意:))
  • 顺便说一句,你是怎么想到[\D\W\S]的?它的意思是“一个不是数字或不是字母数字的字符(已经包含“不是数字”)或不是空白字符。因此,它匹配任何字符,在正则表达式中,这就是点(.:任何字符(换行符除外))。除非您使用 JavaScript,在这种情况下,如果您没有允许您指定单行模式的选项,您可能需要 [\S\s],所以点真的匹配 any 字符。
  • 我需要表达式来匹配 Drupal Feeds xpath 解析器中的某个文本。点是不够的,因为它还应该匹配换行符。由于我的测试,我错误地将它留在这里。 [\S\s].* 不起作用。我现在实际上使用 [\D\W\S\n]。我为 php 找到了替代 /(.*)/sU 但这在 xpath 解析器中不起作用。

标签: regex


【解决方案1】:

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

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

说明:

^        # 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

【讨论】:

  • 完美!也感谢您的快速回复。因为文本也有换行符,并且末尾有一个数字应该省略,所以这是有效的:^(.*?) - ([\D\W\S\n]*)\d{10 }
  • 太好了,很高兴听到。但你最好使用[\S\s]* 而不是[\D\W\S\n]*。
猜你喜欢
  • 2011-01-02
  • 2016-09-28
  • 2016-03-18
  • 1970-01-01
  • 2022-08-13
  • 2016-10-14
  • 1970-01-01
相关资源
最近更新 更多