【问题标题】:Regex match string if not正则表达式匹配字符串,如果不是
【发布时间】:2016-06-18 09:23:17
【问题描述】:

我正在使用正则表达式替换 html 文件中的图像源 URL。

例如,我想将 img/ 替换为 <?= $folder ?>/img/

问题: 当我多次运行正则表达式时,它将再次替换img/,创建:

<?= $folder ?>/<?= $folder ?>/img

..等等。如果还没有&lt;?= $folder ?&gt;/img,有没有办法告诉正则表达式替换img/

我正在尝试/^(?:(?!&lt;?= $folder ?&gt;/img).)*$/,但不确定如何首先匹配并检查它是否尚未包含&lt;?= $folder ?&gt;/img

【问题讨论】:

  • 我不知道它是否会更清晰,但你可以先用[PLACEHOLDER]替换完整的字符串,然后进行替换,然后再次用完整的字符串替换[PLACEHOLDER] .我相信您可以只用一个 RegEx 进行替换,但这种方式将是一种更线性的替代方法。
  • @anubhava 我更新了我的问题
  • 你为什么要使用正则表达式?您只需要进行查找和替换。
  • @Mikey 用于使用正则表达式的 gulp 组件
  • 您的正则表达式 /^(?:(?!&lt;?= $folder ?&gt;\/img).)*$/ 工作正常,如果输入中已经存在相同的字符串,则不会替换

标签: javascript html regex image directory


【解决方案1】:

试试/(?!&lt;\?= $folder \?&gt;)img\//

开头的那位,(?!&lt; ... ) 是否定后向的符号,即检查... 是否在字符串中更早。在这种情况下,我们正在检查字符串
&lt;\?= $folder \?&gt;(注意转义的问号)是否在字符串的前面。 如果该部分在img/ 行的前面找到,它将被拒绝,并且不会匹配。所以,img/ 的每个 case 只会匹配一次。

此正则表达式对于出现多次img/ 的行将失败。可能有一种方法可以允许多次出现,但它可能是一个很长的正则表达式;在我看来,通常当正则表达式太长时,可能是时候切换到不同的工具了。

【讨论】:

  • 请详细说明此正则表达式如何回答问题。
【解决方案2】:

如果您更喜欢正则表达式,请尝试:

function matchIfNot(str) {
  var newstr = str.replace(/^(?!(<\?=\s\$folder\s\?>\/))(img\/)/g, "<?= $folder ?>/img/")
  alert("Old string: " + str + "\nNew string: " + newstr)
}

matchIfNot("<?= $folder ?>/img/")
matchIfNot("img/")

输出:

Old string: <?= $folder ?>/img/
New string: <?= $folder ?>/img/

Old string: img/
New string: <?= $folder ?>/img/

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多