嘿伙计们 - 我正在试图创造一个正则表达式,以便匹配以下内容:
{TextOrNumber{MoreTextOrNumber}}
请注意匹配的打开/关闭号码{}。这甚至可能吗?
非常感谢。
答案 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”标记。这很容易,因为它们不再嵌套。
我很高兴在一些解析器中使用这个想法(包括分离匹配的括号类型,如“(){} []”等)。
但是在你走这条路之前,一定要在更简单的应用程序中使用正则表达式:你将遇到许多小问题而你需要经验来解决它们(而不是转变一个小问题)分为两个小问题等。)。