【问题标题】:regex lookbehind正则表达式向后看
【发布时间】:2018-03-16 15:15:04
【问题描述】:

我对正则表达式后视有疑问!

这是我的示例文本:

 href="dermatitis>" "blah blah blah >" href="lichen-planus>" 

我想匹配所有>" 当且仅当它之前的某个地方有一个href= 并且还有另一个规则!

href= 必须紧接在前一个引号之前。 (例如,文本中的第二个&ght; 前面有一个href=,但href= 不在前一个引号之前,我不希望它匹配)在我的文本中,有3 个&ght; 和我希望根据我上面描述的规则匹配第一个和第三个,而第二个不匹配。

我希望问题得到足够的解释!我处理一些离线文本文件,我可以使用 notepad++、powershell 或任何其他合适的引擎。

我们将不胜感激。

【问题讨论】:

  • 我有一个正则表达式的问题你尝试了什么?
  • 我在正则表达式页面中进行了搜索。但似乎lookbehind在可变长度方面有一些限制

标签: regex powershell notepad++ lookahead lookbehind


【解决方案1】:

Notepad++ 不理解lookbehind,你必须改用\K

  • Ctrl+F
  • 查找内容:href="[^"]*\K>(?=")
  • 检查环绕
  • 检查正则表达式
  • 在文档中搜索

说明:

href="[^"]* : search for href=" followed by 0 or more any charcater but "
\K          : forget all we have seen until this position
>        : literally >
(?=")       : lookahead, make sure we have '"' after

【讨论】:

    【解决方案2】:

    我知道我迟到了 2 年,但无论如何 :) 这是解决方案:

    $string = 'href="dermatitis>" "blah blah blah >" href="lichen-planus>"'
    $value = '>"'
    $regex = 'href=".+?(' + $value + ')'
    ([regex]::matches($string,$regex).groups.value) | ? {$_ -eq $value}
    

    这将返回第一个和第三个值:

    >"
    >"
    

    【讨论】:

      【解决方案3】:

      另一种通过 PowerShell 攻击它的方法,也可以删除不需要的 >

      # Set the regular expression
      $regex = '(?<=href\=")(.*?)(?=")'
      
      $sampleText = 'href="dermatitis>&ght;" "blah blah blah >" href="lichen-planus>&ght;"'
      
      # Separate the single line string into 3 entities with " " as the delimiter
      $sampleTextSplit = $sampleText.Split(" ")
      
      $sampleMatches = $sampleTextSplit | Where-Object {$_ -match $regex} | Foreach-Object { $_.Replace("&gt;","") }
      
      # Show the results
      $sampleMatches
      

      这会返回两个对象:

      href="dermatitis>"
      href="lichen-planus>"
      

      【讨论】:

      • 如果您复制并粘贴该代码,您会发现它实际上并没有返回您所说的内容。您在示例文本中有错字。
      • 此外,此解决方案不会留下中间 &gt (顺便说一句,您的示例文本中也缺少)
      【解决方案4】:

      如果您的输入在每个项目之间总是有空格,您可以在 PowerShell 中执行此操作:

      $a = '"href="dermatitis&gt;" "blah blah blah &gt;" href="lichen-planus&gt;"'
      $b = $a.Split(" ")
      $c = $b | ? { $_ -match 'href="' }
      Write-Output $c
      

      【讨论】:

      • 这不符合帖子中的要求
      • 嗨。我的作品有超过 30000 页,正如我所说的,我想从中删除 &gt。我认为一种解决方案是我匹配每个 (?
      • 你最初的帖子没有提到任何关于删除 >字符串,但我会看到为您创建一个示例
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多