2d中的正则表达式是否有任何好的/有趣的类比?

时间:2009-03-05 17:20:00

标签: regex algorithm language-agnostic graphics

两维中的正则表达式是否有任何好的(或至少有趣但有缺陷的)类似物?

在一个维度上,我可以编写类似/aaac?(bc)*b?aaa/的内容,以快速拉出交替的bc s区域,边框至少为a个。也许同样重要的是,我可以在一个月后回来,一目了然地看到它在寻找什么。

我发现自己在2d中编写类似问题的自定义代码(一些更复杂/受限制),如果我必须自己编写引擎,那么使用更简洁和标准化的符号会更好。

第二个例子可能被称为“找到+”。目标是找到一个包含3个或更多a个列的b列,其中包含3个或更多aa,其中包含三个或更多..7...hkj.k f 7...a h o j ----a-------- j .a,g- 8 9 .aaabaaaaa7 j k .a,,g- h j hh a----? j a hjg s。它应匹配:

{{1}}

可能写成[b ^(a {3})v(a {3})>(a {3})<(a {3})]或......

建议?

4 个答案:

答案 0 :(得分:10)

不是正则表达式专家,但发现问题很有趣,我环顾四周,发现这个有趣blog entry。特别是那里用于定义2D正则表达式的语法看起来很吸引人。与之相关的论文可能比你说的更多。

从评论更新:以下是指向主要作者页面的链接,您可以在该页面下载链接的论文“二维语言”http://www.mat.uniroma2.it/~giammarr/Research/pubbl.html < / p>

答案 1 :(得分:4)

好问题。

首先,问问自己是否可以将模式约束为“+”模式,或者是否还需要测试/匹配矩形。例如,[bc] a边框a矩形将匹配下方的中心矩形,但也会匹配{{“形状的{{} 1}}(在你的语法中)

[c([bc]*a})v([bc]*a)>([bc]*a)<([bc]*a)]

如果你可以将它限制为“+”,那么你的任务就容易多了。正如ShuggyCoUk所说,解析RE通常相当于DFSM - 但是对于单个串行输入来说,这极大地简化了事情。

在“RE +”引擎中,您不仅要调试引擎,还要调试输入表达式的每个位置。我希望编译器捕获它可能发生的任何错误。鉴于此,您还可以使用显式为​​四个RE的内容,例如:

xxxaaaaaxxx
yzyabcba12d
defabcbass3
oreabcba3s3
s33aaaaas33
k388x.egiee

但是,根据您的实施情况,这可能很麻烦。

关于遍历引擎 - 北/西模式是否匹配RtL或LtR?如果模式与贪婪的子匹配不同,那么这可能很重要。

顺便说一下,我认为你的例子中的'^'应该是左边的一个字符,在括号外。

答案 2 :(得分:3)

正则表达式旨在为一维中的模型建模。据我了解,您希望匹配二维字符数组中的模式。

你能使用正则表达式吗?这取决于您要搜索的属性是否可分解为可在一个维度上匹配的组件。如果是这样,您可以在列和行上运行正则表达式,并从中查找解决方案集中的交集。根据您遇到的特定问题,这可能会解决问题,或者可能会在您的二维阵列中找到可能是解决方案的区域。

无论您的问题是否可分解,我认为编写一些自定义代码将是不可避免的。但至少听起来这是一个有趣的问题,所以工作应该是愉快的。

答案 3 :(得分:3)

你基本上是在谈论spatial query language。如果你查找空间查询,地理查询和图形查询,那里有很多。空间部分通常归结为具有其他给定属性的区域中的点,线和对象。可以将区域指定为多边形,距离点(例如圆圈)的距离,距离线性要素(例如道路)的距离,线性要素一侧的所有点等等...然后您可以进入更复杂的查询,例如集合所有最近邻居,最短路径,旅行推销员,以及Delaunay TIN和Voronoi图等细分。

相关问题