【问题标题】:Match a string starting with : character, but not starting with \:匹配以 : 字符开头但不以 \ 开头的字符串:
【发布时间】:2018-04-28 14:55:39
【问题描述】:

我需要一个正则表达式来替换以单个 : 开头但不以 \: 开头的长字符串中的单词。

匹配::Amazing

不匹配:\:Amazing

我试过[^\\](:Amazing),但它也匹配x:Amazing

我想替换字符串Hello, this is :Amazing and also \:Amazing

Hello, this is COOL and also :Amazing

谢谢。

【问题讨论】:

  • 所以你只需要(?<!\S):Amazing?演示regex101.com/r/dc7iL9/1
  • 不客气。我为 PHP 和 JS 添加了答案。

标签: javascript php regex


【解决方案1】:

您是说在: 之后不需要任何字符。您需要对此进行消极的回顾:

:(?<!\S.)Amazing
  • \S 表示非空白字符

注意:这适用于 PHP PCRE

Live demo

JavaScript 不支持lookbehinds(目前仅支持 Google Chrome)。要在 JS 中也有它,你需要这样的东西:

var str = `Hello, this is :Amazing and also \\:Amazing x:Amazing`;
console.log(str.replace(/(^|\s):Amazing/g, "$1COOL"));

【讨论】:

  • 你为什么不像你在评论中那样写呢?这样可以减少步骤。有没有我没有考虑的边缘案例?
  • @mickmackusa 当您在正则表达式中使用文字字符或已知起点时,在 PCRE 中执行匹配过程之前会进行一些优化。这会导致更快的失败或成功。您不想依赖 regex101 步骤。当你点击左侧的 regex debugger 时你会看到什么?
  • 以前从未点击过。呃,真烦人——我一直依赖步数。我不喜欢调试器如何让我远离我的模式编写界面。现在我希望他们能提供步数所在的调试器计数。 ...就此而言,我也从未点击过代码生成器。
猜你喜欢
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
  • 2015-12-11
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
相关资源
最近更新 更多