【问题标题】:match everything except the regex pattern匹配除正则表达式模式之外的所有内容
【发布时间】:2021-05-26 12:24:03
【问题描述】:

我有一个xml内容如下

<html>
<head><title>502 Bad Gateway</title></head>
<body>
<center><h1>502 Bad Gateway</h1></center>
</body>
</html>

在上面我想处理除标题中的 502 Bad Gateway 之外的所有内容。

我使用下面的正则表达式来匹配 502 Bad Gateway

(?<=title>)(.*?)(?=<\/title>)

谁能告诉我如何否定它?

我尝试了以下建议

(?!((?<=title>)(.*?)(?=<\/title>)))
[^((?<=title>)(.*?)(?=<\/title>))]

但他们没有工作。

我正在使用 ruby​​ 正则表达式

【问题讨论】:

  • 您使用哪种语言/正则表达式引擎?建议包含此信息,因为不同正则表达式引擎的功能不同。
  • 你到底想做什么?您想从字符串中删除标题吗?然后只需使用re.sub(或其他语言的类似方法)
  • 我正在使用 ruby​​ 正则表达式

标签: regex ruby


【解决方案1】:

对 ruby​​ 不是很熟悉,但我认为 regex 的特性与 PCRE 相似,PCRE 支持控制动词和递归。

这是与您的描述相匹配的正则表达式:

((?<=title>)502 Bad Gateway(?=<\/title>))(*SKIP)(*F)|(?:(?!(?1))[\s\S])+

proof

【讨论】:

  • 您好,吴浩,这仅适用于 PHP
【解决方案2】:

您可以使用sub 删除title 中的“502 Bad Gateway”:

xml = "<head><title>502 Bad Gateway</title></head>"
xml.sub("<title>502 Bad Gateway</title>", "<title></title>")
# => "<head><title></title></head>"

【讨论】:

    【解决方案3】:

    您想要获取所有与正则表达式不匹配的内容吗?

    用你喜欢的语言保存你的结果。

    使用一些工具,例如:

    • WinMerge
    • 无与伦比
    • KDiff3
    • 差异合并
    • 合并
    • ...

    其中一些可以生成补丁。使用 File -> Open... 打开两个版本进行比较。这将使您对所做的更改有一个很好的了解。 https://docs.moodle.org/dev/How_to_create_a_patch#Creating_a_patch_using_WinMerge

    【讨论】:

      猜你喜欢
      • 2022-08-21
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      相关资源
      最近更新 更多