有没有一种方法可以在正则表达式中“撤回”已匹配的字符序列?

4

我要翻译的正则表达式有以下限制:

  • 以"//"开头
  • 随后是"["一个非数字序列(称为分隔符)和"]"
  • 下一行是"\n"
  • "[" 0个或多个由先前找到的分隔符分隔的数字。

例如,以下文本与正则表达式匹配:

//[*#*]
[1*#*34*#*64]

以下文本与正则表达式不匹配:

//[*#*]
[1#34#64]

因为分隔符与第一行不匹配,所以出现了这个问题。
我目前创建的正则表达式是:
^//\[(\D)+\]\n\[[(\d)+(\D)+]*(\d)+\]$|^//\[(\D)+\]\n\[\]$|^//\[(\D)+\]\n\[(\d)+\]$

但是很明显,这个正则表达式与前面的两个示例都匹配。

是否有一种方法可以在正则表达式本身中“召回”已匹配的字符序列?


2
查找“反向引用”。举个快速的例子,\(.*\)\1匹配任何形式为<s><s>的字符串。这意味着一个由将一个字符串连接到自身而成的字符串。 - Guido
1
你使用的是什么编程语言? - justhalf
2个回答

3

在大多数编程语言中,您需要使用后向引用来引用匹配的组。其中n表示组号。

以下模式可行:

//\[([^]]++)]\n\[(?>\d++\1?)+]

简单来说:

  • //匹配字面意义的斜杠
  • \[([^]]++)]匹配方括号中的某些字符
  • \n匹配换行符
  • \[(?:\d++\1?)++]匹配一个或多个数字,后跟第一个模式部分捕获的匹配 - 可选。这是原子组。

3

您需要使用所谓的反向引用(这里有一篇非常好的教程here)。

在Python中使用此正则表达式:

r'^//\[([^\]]+)\]\n\[\d+(\1\d+)*\]'

样例运行:

>>> string = """//[*#*]
... [1*#*34*#*64]"""
>>> print re.search(r'^//\[([^\]]+)\]\n\[\d+(\1\d+)*\]',string).group(0)
//[*#*]
[1*#*34*#*64]

这个正则表达式将在Python中匹配您的字符串。

正则表达式可视化

Debuggex演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接