【问题标题】:How to make regex match space OR end of string?如何使正则表达式匹配空间或字符串结尾?
【发布时间】:2014-03-12 22:08:31
【问题描述】:

我需要制作一个正则表达式来匹配一些液体体积,例如:

water in 17oz container
water in container 17oz

你会如何制作一个正则表达式来匹配这些? 我可以只做/[0-9]{1,}oz/,但这也将匹配 90ozonelayers,并不是说它会发生,但我希望它是万无一失的。

如果 /[0-9]{1,}oz / 在字符串的末尾,则不会匹配它。

【问题讨论】:

  • \s 匹配空格(例如空格、制表符和换行符)
  • /[0-9]{1,}oz[\s$]/ 呢?
  • @EugenRieck,匹配文字“$”或空格。
  • @tenub 我的错,必须是/[0-9]{1,}oz(\s|$)/ 或类似的

标签: php regex


【解决方案1】:

您可以使用\b 来匹配单词边界:

/\b[0-9]+oz\b/

【讨论】:

  • 这也是一个错误的解决方案,因为单词边界匹配任何非单词字符,即。 [^a-zA-Z0-9_]。这意味着“17ozŵald”中的“17oz”将匹配。
  • 伟大的细粒度观察,@tenub。该死的Unicode! :}
  • @KristianRafteseth:考虑将此答案标记为已接受,以便其他人知道这正是您正在寻找的......而无需阅读 cmets。
【解决方案2】:

简单。只需使用:

/[0-9]{1,}oz(?= |$)/

【讨论】:

    【解决方案3】:

    匹配字符串末尾的 34oz、34 oz 和 6oz,但不匹配 56 臭氧层。

    ([0-9]{0,})(\s{0,})(oz{1})(\s{0,}|$)
    

    【讨论】:

      【解决方案4】:

      [0-9]{1,}oz(\s|\b)

      这与您的两个字符串匹配,但与 12ozsdsds 之类的不匹配。

      编辑:

      注意到所有解决方案都略有缺陷,似乎综合考虑了所有因素,最好的可能是(从 tenub 窃取的位):

      /(?<=\s|^)[0-9]{1,}oz(?=\s|$)/(使用/g 匹配所有匹配项)。

      17oz - 匹配

      abc 17oz def - 匹配

      17ozz - 不匹配

      abc17oz - 不匹配

      【讨论】:

      • 这将匹配“17ozå”中的“17oz”。
      • 是的,虽然 xdazz 的也是如此,而你的匹配 asdasd17oz(我的也是如此,所以更正以合并世界上最好的)。
      • 请注意,由于向后看,这对 JavaScript 不起作用(尽管 OP 指定了 PHP,所以这无关紧要)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2015-09-28
      • 1970-01-01
      • 2011-09-23
      相关资源
      最近更新 更多