正则表达式麻烦

时间:2009-11-02 11:17:15

标签: regex

嘿伙计们 - 我正在试图创造一个正则表达式,以便匹配以下内容:

{TextOrNumber{MoreTextOrNumber}} 

请注意匹配的打开/关闭号码{}。这甚至可能吗?

非常感谢。

4 个答案:

答案 0 :(得分:2)

  

请注意匹配的打开/关闭号码{}。这甚至可能吗?

历史上,没有。但是,现代正则表达式实际上不是常规,有些允许这样的结构:

\{TextOrNumber(?R)?\}

(?R) recursively inserts the pattern again。请注意,目前没有多少正则表达式引擎支持它。

答案 1 :(得分:0)

如果您没有可用的递归扩展,则无法使用1个正则表达式。您必须多次匹配如下所示的正则表达式

/\{[a-z0-9]+([a-z0-9\{\}]+)?\}/i

捕获“MoreTextOrNumber”并让它再次匹配,直到你通过或失败。

答案 2 :(得分:0)

如果需要执行任意数量的大括号,可以使用解析器生成器,或在嵌套函数内创建正则表达式。以下是ruby中递归正则表达式的一个示例。

def parse(s)
  if s =~ /^\{([A-Za-z0-9]*)({.*})?\}$/ then
    puts $1
    parse($2)
  end
end

parse("{foo{bar{baz}}}")

答案 3 :(得分:0)

不容易但可能

正式地说,正则表达式不是为解析嵌套的成对括号而设计的 - 如果你试图这样做,你会遇到各种各样的问题。还有其他工具(如解析器生成器,例如yacc或bison),这些工具专为此类结构而设计,可以很好地处理它们。但它可以做到 - 如果你做得对,它甚至可能比使用所有支持代码的yacc语法更简单来解决yacc的问题。

以下是一些提示:

首先,如果您的某些字符永远不会出现在输入中,我的建议最有效。通常,\ 01和\ 02之类的字符永远不会出现,所以你可以这样做

s/[\01\02]/ /g; 

确保他们不在那里。否则,您可能希望使用类似

的表达式将它们转义(例如将它们转换为%0和%1等文本)
s/([\01\02%])/"%".ord($1)/ge;

请注意,我还转义了转义字符“%”。

现在,我建议从里到外解析括号 :替换任何子字符串“{text}”,其中“text”包含占位符的任何括号“\ 01 $ number \ 2”并将包含的文本存储在$ array [$ number]:

$number=1;
while (s/\{([^{}]*)\}/"\01$number\02"/e) { $array[$number]=$1; $number++; }
$array[0]=$_;  # $array[0] corresponds to your input

作为最后一步,您可能希望处理@array中的每个元素以拉出并处理“\ 01 $ number \ 02”标记。这很容易,因为它们不再嵌套。

我很高兴在一些解析器中使用这个想法(包括分离匹配的括号类型,如“(){} []”等)。

但是在你走这条路之前,一定要在更简单的应用程序中使用正则表达式:你遇到许多小问题而你需要经验来解决它们(而不是转变一个小问题)分为两个小问题等。)。