我有一个遍历字符串并提取 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 时,如何将这些表达式与替换命令一起使用。似乎每当我使用
\10
时它返回 \1
的值然后附加一个 0
到最后。任何帮助将不胜感激谢谢:)
我也在使用 UEStudio,但如果不同的程序做得更好,那么没什么大不了的 :)
最佳答案
编辑器使用的大多数简单的 Regex 引擎都不能处理 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<2>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.
命名引用通常只能在非常特定的正则表达式库中使用,请测试您的工具以确保知道。
关于正则表达式在替换中支持引用超过 9 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3304283/