2

我意识到反向引用不能在字符类中使用,但我需要这个功能。我想知道是否有替代的有效正则表达式可用于完成此操作。

前提:我使用的是 Visual Studio 2013。它必须在该环境中工作(即 std::regex)。

作为一个简化的示例,我希望执行的是在仅是大写罗马字母(即 AZ)的单词列表上进行搜索,例如假设表达式:

"^(.)([A-\1])([\2-Z])$"

理想情况下,这将返回匹配 3 个字母的单词,其中第二个字符在词法上小于或等于第一个字符,第三个字符在词法上大于或等于第二个字符。示例匹配将包括“CAT”和“EEL”,但不包括“COW”或“PIG”。

那么,是否有一个稍微简单的正则表达式(不包括 26×N 指数交替条件)可以做到这一点?还是我应该编写自己的代码来做到这一点?

附录:没有收到简化案例的替代有效正则表达式我相信可以回答我的问题,因为我只需要编写自己的代码来执行这样的搜索。

要了解现实世界的问题,我将在这里简单地指导您:

http://joeslater.orgfree.com/ZigWord/tutorial.html

该教程可能足以理解该问题,但提供了一些难题,当然欢迎您尝试。它们都是手工生成的。我需要我的程序使用可供选择的单词列表来生成这样的谜题。

真正的问题是当拼图尺寸变得有点大时,例如 9×9 或 11×11 的网格,以及大量的单词(几百或几千)。在拼图构建时尝试每个单词以适应未填充位置的蛮力方法是一个不可接受的解决方案 - 在我取消之前使用这种方法的早期尝试不间断地运行了一周,使用 1,300 个单词的列表作为11×11 拼图(未生成拼图)。

所以我希望在拼图构建时使用正则表达式来过滤掉适合拼图的可能单词。目前,我相信我只需要编写自己的代码来执行此搜索,但如果有人不这么认为,请赐教。

4

4 回答 4

1

在我看来,你对正则表达式所做的任何事情最终都会比简单的表达式更复杂(并且可能更不可读):

s.length()==3 && s[0] >= s[1] && s[1] <= s[2]

...所以是的,在这种情况下,我认为您最好编写自己的代码。

于 2015-01-21T08:01:52.040 回答
0

这是混合方法的一个很好的例子:使用简单的正则表达式来生成候选匹配,并使用自定义逻辑自己过滤它们。

于 2015-01-21T05:03:02.160 回答
0

您可以在字符类中使用十六进制代码。因此一种方法可以是找到hex code$1\1其放入其中character class。您必须在运行时创建正则表达式。类似这样的东西

https://regex101.com/r/tX2bH4/57

\x43C硬编码的。但是您可以在替换之前轻松找到它。

伪正则表达式可以

^(.)([A-(hex code of \1)])([(hex code of \2)-Z])$

         ^^                   ^^

这些将被替换为查找表格并获取十六进制代码的小代码\1

于 2015-01-21T05:06:29.713 回答
0

感谢大家的意见。我决定使用混合方法……例如,如果开始的假设表达式是:

"^(.)([A-\1])([\2-Z])$"

这样的表达式不是有效的正则表达式,必须使用自定义代码进行处理,但是当第二个字母后来知道是 I 时,表达式变为:

"^([IZ])([I])([IZ])$"

可以用作匹配“PIT”或“SIT”的有效正则表达式。

于 2015-01-28T13:37:04.260 回答