我意识到反向引用不能在字符类中使用,但我需要此功能。我想知道是否有另一种有效的正则表达式可用于完成此操作。
前提:我正在使用Visual Studio 2013。它必须在该环境中工作(即 std::regex)。
作为一个简化的例子,我希望执行的是搜索一个只有大写罗马字母(即 A-Z)的单词列表,例如假设的表达式:
"^(.)([A-\1])([\2-Z])$"
理想情况下,这将返回 3 个字母单词的匹配项,其中第 2 个字符在词法上小于或等于第 1 个字符,第 3 个字符在词法上大于或等于第 2 个字符。示例匹配项包括"CAT"和"EEL",但不包括"COW"或"PIG"。
那么,是否有一个稍微简单的正则表达式(不包括 26×N 指数替代条件)可以做到这一点?还是我应该编写自己的代码来执行此操作?
附录:没有收到简化情况的替代有效正则表达式,我相信可以回答我的问题,因为我只需要编写自己的代码来执行此类搜索。
为了理解现实世界的问题,我将简单地引导你:
http://joeslater.orgfree.com/ZigWord/tutorial.html
本教程可能足以理解问题,但提供了一些难题,当然欢迎您尝试。它们都是手工生成的。我需要我的程序使用可供选择的单词列表生成此类谜题。
当谜题大小变得有些大时,真正的问题就来了,例如 9×9 或 11×11 网格,以及大量单词(几百或数千个)。在构建谜题时尝试每个单词以适应未填充位置的蛮力方法是一个不可接受的解决方案——使用这种方法的早期尝试在我取消它之前不间断地运行了一个星期,使用 1,300 个单词的列表进行 11×11 谜题(没有生成谜题)。
因此,我希望在构建拼图时使用正则表达式来过滤掉适合拼图的可能单词。目前,我相信我只需要编写自己的代码来执行此搜索,但如果有人不这么认为,请启发我。
在我看来,你对正则表达式所做的任何事情最终都会比像这样的简单表达式更复杂(并且可能更易读):
s.length()==3 && s[0] >= s[1] && s[1] <= s[2]
。所以是的,在这种情况下,我认为你最好编写自己的代码。
这是混合方法的一个很好的例子:使用简单的正则表达式生成候选匹配项,并使用自定义逻辑自行过滤它们。
您可以在字符类中使用十六进制代码。因此,一种方法可以是找到$1
或1
hex code
并将其放入character class
。您必须在运行时创建正则表达式。像这样的东西
https://regex101.com/r/tX2bH4/57
这里x43
C
是硬编码的。但是在更换之前,您可以轻松找到它。
伪正则表达式可以是
^(.)([A-(hex code of 1)])([(hex code of 2)-Z])$
^^ ^^
这些将被替换为查找表并获取十六进制代码以进行1
的小代码。
感谢大家的投入。我决定使用混合方法...例如,如果开头假设表达式为:
"^(.)([A-\1])([\2-Z])$"
这样的表达式不是有效的正则表达式,必须使用自定义代码进行处理,但是当第二个字母后来被知道为 I 时,表达式将变为:
"^([I-Z])([I])([I-Z])$"
可以用作匹配"PIT"或"SIT"的有效正则表达式。