正则表达式仅使用换行符匹配节点一次

时间:2018-01-25 17:12:59

标签: regex newline

大家好我真的需要帮助。 客户端想要替换xml标记中的某些字符串。 XML看起来如下,有数千个这样的节点。我需要匹配来自=>的部分< tuv xml:lang =“en-US”>< seg> ac0037018< / seg>包括换行。

<tu tuid="2" srclang="en-US">
      <tuv xml:lang="en-US">
        <seg>ac0037018</seg>
      </tuv>
      <tuv xml:lang="da-DK" creationdate="20130211T114451Z" 
      <seg>some text</seg>
      </tuv>
  </tu>
  <tu tuid="3" srclang="en-US">
      <tuv xml:lang="en-US">
        <seg>Ball valves</seg>
      </tuv>
      <tuv xml:lang="da-DK" creationdate="20110801T083108Z"  >           
      <seg>Kugleventiler</seg>
      </tuv>
</tu>

但是我的正则表达式匹配整个xml而不是一次的实例。你能帮忙吗?

(<tuv xml:lang="en-US">)(\r\n.*)(<seg>.*?)any text(.*?</seg>)

1 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式:

<tuv xml:lang="en-US">\s*<seg>(.+?)<\/seg>(\s*\n)

它会捕获tuv / seg个片段。

我认为,你使用了太多的捕获组。 唯一合理的捕获组是seg元素的内容。

请注意:

  • 我的正则表达式中唯一的捕获组在?之后包含+不情愿版本),以防止捕获太多。如果你有 你的理由,添加任何其他捕获组。
  • {li> /之前seg(在结束标记中)使用\进行转义,因为 典型的正则表达式分隔符只是斜杠。如果你使用其他分隔符, 你可以自由删除它。
  • \s也匹配\n\r
  • 您希望捕获文本包括换行符(在整体中) 匹配),所以我的正则表达式的最后一部分是:
    • 一系列任意“白色”字符(可能存在于之前) 行),
    • 您想要包含在比赛中的换行符。
  • 或许您想要捕捉tuvseg之间的换行符 打开标签?如果是这种情况,请删除最后一部分。