【问题标题】:Is there a way to "recall" a char sequence already matched in the regex itself?有没有办法“召回”正则表达式本身已经匹配的字符序列?
【发布时间】:2013-12-23 01:27:23
【问题描述】:

我正在搜索的正则表达式具有以下约束:

  • 以“//”开头
  • 然后“[”是一个非数字序列(在此列表中称为分隔符)和“]”
  • 下一行“\n”
  • “[”0 个或多个数字,由先前找到的分隔符“]”分隔。

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

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

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

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

因为分隔符在第一行不匹配

我目前创建的正则表达式是

^//\[(\D)+\]\n\[[(\d)+(\D)+]*(\d)+\]$|^//\[(\D)+\]\n\[\]$|^//\[(\D)+\]\n\[(\d)+\]$

但显然这个正则表达式与前面的两个例子都匹配。

有没有办法“召回”已经在正则表达式中匹配的字符序列?

【问题讨论】:

  • 查找反向引用。举个简单的例子,\(.*\)\1 匹配<s><s> 形式的任何字符串。意思是,一个字符串由一个字符串连接到它自己。
  • 您使用的是什么语言?

标签: regex delimiter


【解决方案1】:

你需要一个叫做反向引用的东西(一个非常好的教程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 Demo

【讨论】:

    【解决方案2】:

    您需要使用反向引用,在大多数语言中,您可以使用\n 引用匹配组,其中n 是组号。

    这种模式会起作用:

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

    分解:

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

    【讨论】:

      猜你喜欢
      • 2019-02-11
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 2011-01-04
      相关资源
      最近更新 更多