【问题标题】:Find specific word inside a string in xml tag using regex in notepad++?在记事本++中使用正则表达式在xml标记中的字符串中查找特定单词?
【发布时间】:2018-02-06 12:13:11
【问题描述】:

<name>我的名字是汤姆,但人们称我为 XYZ 但我的真名是汤米!</name>

  • 现在,我想在指定的 xml 标记中找到“Tom”,并将其替换为 Harry。
  • 查找多个“Tom”实例并将其替换为指定 XML 标记内字符串中的“Harry”。

示例: (?<=<name>)[a-zA-Z]*(Tom)[a-zA-Z]*(?=<\/name>),

  • 这无法从 XML 标记之间的指定字符串中找到单词“Tom”。

【问题讨论】:

  • <name>标签可以包含其他标签吗?
  • 不,它只包含 标签。我的 XML 文件中有很多标签,但我只针对 标签。并且 不包含任何其他标签。

标签: regex xml notepad++


【解决方案1】:

由于name标签里面不能有其他标签,所以可以解决问题的正则表达式是

(?:\G(?!^)|<name>)[^<]*?\K\bTom\b

请参阅regex demo。替换为Harry

详情

  • (?:\G(?!^)|&lt;name&gt;) - 上一个成功匹配的结束 (\G(?!^)) 或 (|) &lt;name&gt; 子字符串
  • [^&lt;]*? - 除&lt; 之外的任何 0+ 个字符,尽可能少
  • \K - 匹配重置运算符
  • \bTom\b - 整个单词 Tom(如果您需要匹配 Tommy 中的 Tom,请删除 \b 单词边界)。

注意:如果您还想匹配Tommy,请将\bTom\b 替换为\bTom(?:my)?\b

【讨论】:

    【解决方案2】:

    查找内容:(?&lt;=&lt;name&gt;)(.*?)(Tom)(?=\b.*&lt;/name&gt;)
    替换为:$1Harry

    详情:
    应答器名称:(?&lt;=&lt;name&gt;)
    姓名和汤姆之间的任何内容(.*?)
    汤姆(Tom)
    检查单词结尾的边界 Tom(?=\b
    汤姆和结束名 balise 之间的任何内容 .*
    关闭应答器&lt;/name&gt;)

    重新注入应答器名称和 tom$1 之间的内容
    用 HarryHarry 替换 Tom

    【讨论】:

      猜你喜欢
      • 2010-10-31
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多