【问题标题】:Regex: delete everything between String and replace with other正则表达式:删除字符串之间的所有内容并替换为其他
【发布时间】:2021-10-19 04:23:55
【问题描述】:

所以我一直在为这个问题摸不着头脑,我有一千多个在字符串之间具有不同值的文件

<lodDistances content="float_array">
    15.000000
    25.000000
    70.000000
    140.000000
    500.000000
    500.000000
  </lodDistances>

我需要用这些替换这些值

<lodDistances content="float_array">
  120.000000
  200.000000
  300.000000
  400.000000
  500.000000
  550.000000
</lodDistances>

我尝试了以下没有任何成功

\ (?<=\<lodDistances content\=\"float_array\"\>)(.*)(?=\<\/lodDistances\>)

当我尝试在文件中找到它时,它似乎在正则表达式中找到它,但不是在崇高的文本中,我经常得到 0 个结果。知道为什么会这样吗?

【问题讨论】:

  • 只是一种 XML 文件格式
  • 试试这个(?s)(?&lt;=&lt;lodDistances content="float_array"&gt;\n).*?(?=\n\s+&lt;\/lodDistances&gt;)
  • @CarySwoveland,他提到他正在使用 sublime 文本编辑器进行替换
  • 仍然没有匹配 :(
  • 只是为了确定,您是否检查了 Sublime 中的正则表达式按钮?将其与示例数据一起使用,我得到了匹配 (?s)(?&lt;=&lt;lodDistances content="float_array"&gt;)(.*?)(?=&lt;/lodDistances\&gt;)

标签: regex xml sublimetext3


【解决方案1】:

您的模式中有几处是错误的:

  • \&lt; 匹配前导词边界位置(如 \b(?=\w)),\&gt; 匹配尾随词边界位置(同 \b(?&lt;=\w))。您想匹配文字 &lt;&gt; 字符,因此,您不能转义它们
  • 第一个&lt;之前不需要匹配空格
  • 由于您的文本是多行的,请使用(?s) 内联修饰符或(?s:...) 修饰符组使. 匹配换行符,或使用[\s\S] / [\w\W] / [\d\D] 解决方法
  • 使用惰性点模式在第一次出现尾随分隔符时停止匹配。

你可以使用

(?s)(<lodDistances content="float_array">\s*).*?(?=\s*</lodDistances>)

并替换为${1}&lt;new values&gt;。花括号是必需的,因为new values 很可能是数字,如果没有花括号,$1nn 在这里代表一个数字)将被错误地解析(请参阅this YT video for a demo of what it is fraught with)。

请看下面的演示:

V

正则表达式详细信息

  • (?s) - 现在,. 也匹配换行符
  • (&lt;lodDistances content="float_array"&gt;\s*) - 第 1 组捕获 &lt;lodDistances content="float_array"&gt; 文本,然后是零个或多个空格
  • .*? - 任何零个或多个字符,但尽可能少
  • (?=\s*&lt;/lodDistances&gt;) - 与紧跟零个或多个空格和 &lt;/lodDistances&gt; 文本的位置相匹配的正向前瞻。

请注意,/ 不是特殊的正则表达式元字符,并且由于 Sublime Text 不支持正则表达式分隔符符号,因此您不必在此处对其进行转义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多