两维中的正则表达式是否有任何好的(或至少有趣但有缺陷的)类似物?
在一个维度上,我可以编写类似/aaac?(bc)*b?aaa/
的内容,以快速拉出交替的b
和c
s区域,边框至少为a
个。也许同样重要的是,我可以在一个月后回来,一目了然地看到它在寻找什么。
我发现自己在2d中编写类似问题的自定义代码(一些更复杂/受限制),如果我必须自己编写引擎,那么使用更简洁和标准化的符号会更好。
第二个例子可能被称为“找到+”。目标是找到一个包含3个或更多a
个列的b
列,其中包含3个或更多a
个a
,其中包含三个或更多..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})]或......
建议?
答案 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图等细分。