【问题标题】:Regex expression to back reference more than 9 values in a replace正则表达式在替换中反向引用超过 9 个值
【发布时间】:2011-03-19 06:30:51
【问题描述】:

我有一个正则表达式,它遍历一个字符串并提取 40 个值,它看起来像下面的查询那样排序,但更大更复杂

est(.*)/test>test>(.*)<test><test>(.*)test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test>

我的问题是,当数量超过 9 时,如何将这些表达式与 replace 命令一起使用。似乎每当我使用 \10 时,它都会返回 \1 的值,然后在末尾附加一个 0 .

任何帮助将不胜感激谢谢:)

我也在使用 UEStudio,但如果其他程序做得更好,那就没什么大不了了 :)

【问题讨论】:

  • 在 Sublime Text 中,"\10" 也不起作用,但 "$10" 起作用。

标签: regex ultraedit


【解决方案1】:

在两位数的子组前面放一个 $:例如\1\2\3\4\5\6\7\8\9$10 它对我有用。

【讨论】:

  • 哇,谢谢你的提示。这在记事本++中效果很好:)
【解决方案2】:

尝试使用命名组;所以不是第十个:

(.*)

使用:

(?<group10>.*)

然后使用以下替换字符串:

${group10}

(这当然是在没有使用循环的更好解决方案的情况下,请记住,根据您的环境,可能会有不同的正则表达式语法风格。)

【讨论】:

  • 在 nginx 中使用正则表达式匹配时,这对我有用,它似乎不喜欢匹配超过 9 个组。 OP 有同样的问题,其中 $10 被解释为 $1 + 0。
【解决方案3】:

编辑器使用的大多数简单正则表达式引擎都无法处理超过 10 个匹配组; UltraEdit 似乎不能。我刚刚尝试过 Notepad++,它甚至不会 匹配 10 个组的正则表达式。

我认为,你最好的选择是用一种快速的语言和一个体面的正则表达式解析器快速编写一些东西。 但这不能回答所问的问题

这是 Python 中的一些东西:

import re

pattern = re.compile('(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)')
with open('input.txt', 'r') as f:
    for line in f:
        m = pattern.match(line)
        print m.groups()

请注意,Python 允许反向引用,例如 \20:为了对组 2 进行反向引用,后跟文字 0,您需要使用 \g&lt;2&gt;0,这是明确的。

编辑: 大多数正则表达式和包含正则表达式引擎的编辑器都应遵循以下替换语法:

abcdefghijklmnop
search: (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(?<name>.)(.)
note:    1  2  3  4  5  6  7  8  9  10 11 12 13
value:   a  b  c  d  e  f  g  h  i  j  k  l  m
replace result:
    \11      k1      i.e.: match 1, then the character "1"
    ${12}    l       most should support this
    ${name}  l       few support named references, but use them where you can.

命名引用通常只能在非常特殊的正则表达式库中使用,请测试您的工具以确定。

【讨论】:

  • "有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题。 - Jamie Zawinski 上面的引述似乎从未如此真实 :( 感谢您的帮助 :)
【解决方案4】:

正如psycho brm 指出的那样: 使用 $10 而不是 \10 我正在使用记事本++,它工作得很好。

【讨论】:

  • 在 Sublime 上工作。可能在其他一些人身上。有谁知道这个 $ 符号是什么标准的一部分?
【解决方案5】:

如果您不能处理超过 9 个子组,为什么不首先匹配 9 个组,然后循环并将正则表达式应用于这些匹配项?

即首先匹配(&lt;test.*/test&gt;)+,然后为每个子组匹配&lt;test(.*)/test&gt;

【讨论】:

  • 不幸的是,在我的情况下这不起作用,模式相当大。不过我很欣赏这个建议。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 2019-03-25
  • 2016-06-30
相关资源
最近更新 更多