【问题标题】:PHP Regex look ahead and look behind - both must not match?PHP Regex 向前看向后看 - 两者一定不匹配?
【发布时间】:2012-06-20 11:23:38
【问题描述】:

我目前正在寻找一种在某些地方从字符串中删除句号的方法。

我希望它只有在不满足 2 个条件时才会删除句号;

   句号之前没有数字。

   句号后没有数字。

我目前有这个正则表达式

'#(?<!\d)\.(?!\d)#'

但这不会删除字符串中的句号,例如

'hello.1', '1.hello'

我猜是因为在句号之前或之后有一个数字,所以匹配失败并且无法识别。

我怎样才能做到既要向前看又要向后看,才能进行匹配并正确删除句号?

谢谢。

编辑

当且仅当 ~OR~ 之前没有数字时,我希望它删除句号,句号之后没有数字。因此,如果字符串像 (a digit).(a digit) 这样,则只能有句号,但在任何其他情况下都会删除句号。

【问题讨论】:

  • 你的问题对我来说似乎很矛盾。 There is not a digit before the fullstop AND There is not a digit after the fullstop,如果您使用的是 and,它将仅在满足两个条件时才匹配,您的示例字符串正确地无法匹配。你的意思是or
  • 我的意思是当且仅当句号之前没有数字并且句号之后没有数字时,我希望它删除句号。所以只有这样才能有句号1122.2323
  • 您在问题中的措辞令人困惑。你能举例说明“1.6”和“h.j”的预期输出吗?
  • 我编辑了这个问题,很抱歉造成混乱!
  • 你又做了一次。 :-p not (before AND after)not before AND not after 不同。根据De Morgan's laws,与not before OR not after相同。

标签: php regex


【解决方案1】:

你可以这样做:

'#((?<!\d)\.|\.(?!\d))#'

如果它之前或之后是非数字,它将删除点。

【讨论】:

  • 我没有想到这一点,所以我不得不拆分它而不是 1 个大模式,谢谢 :)
猜你喜欢
  • 2012-07-04
  • 2017-06-13
  • 2023-02-26
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多