Regex C++;11使用反向引用作为条件的正则表达式

Regex C++;11使用反向引用作为条件的正则表达式,regex,c++11,character-class,Regex,C++11,Character Class,我意识到反向引用不能在字符类中使用,但我需要这个功能。我想知道是否有其他有效的正则表达式可以用来实现这一点 前提:我正在使用Visual Studio 2013。它必须在该环境中工作(即std::regex) 作为一个简化的示例,我希望执行的是对仅为大写罗马字母(即a-Z)的单词列表的搜索,例如假设表达式: “^()([A-\1])([\2-Z])$” 这将理想地返回3个字母单词的匹配,其中第2个字符在词汇上小于或等于第1个字符,第3个字符在词汇上大于或等于第2个字符。示例匹配包括“猫”和“鳗鱼

我意识到反向引用不能在字符类中使用,但我需要这个功能。我想知道是否有其他有效的正则表达式可以用来实现这一点

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

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

“^()([A-\1])([\2-Z])$”

这将理想地返回3个字母单词的匹配,其中第2个字符在词汇上小于或等于第1个字符,第3个字符在词汇上大于或等于第2个字符。示例匹配包括“猫”和“鳗鱼”,但不包括“牛”和“猪”

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

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

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

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

真正的问题是当拼图尺寸变得较大时,例如9×9或11×11网格,以及大量单词(几百或几千个)时。在拼图制作过程中,用蛮力方法将每个单词放入未填充的位置是一个不可接受的解决方案——早期使用这种方法的尝试持续了一周,直到我取消了它,使用了1300个单词的列表制作了一个11×11的拼图(没有生成任何拼图)


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

这是混合方法的一个很好的例子:使用简单的正则表达式生成候选匹配,您可以在字符类中使用十六进制代码。因此,一种方法可以是找到
$1
\1
十六进制代码
,并将其放入
字符类
中。您必须在运行时创建正则表达式。类似于此

这里的
\x43
C
是硬编码的。但是在替换它之前,您可以很容易地找到它

伪正则表达式可以是

^()([A-(十六进制代码\1)])([(十六进制代码\2)-Z])$


这些代码将被替换为一个小代码,用于查找表并获取十六进制代码,用于
\1

在我看来,使用正则表达式所做的任何操作都将比以下简单表达式更复杂(并且可能可读性更低):

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

s.length()。我决定使用混合方法…例如,如果开始的假设表达式是:

“^()([A-\1])([\2-Z])$”

此类表达式不是有效的正则表达式,必须使用自定义代码进行处理,但当第二个字母后来被称为I时,该表达式将变为:

“^([I-Z])([I])([I-Z])$”


它可以用作匹配“PIT”或“SIT”的有效正则表达式。无可否认,我的示例过于简单。如果总是这样,我会同意杰瑞。我的现实世界问题要复杂得多,暴力方法只适用于小规模。否则,所涉及的组合数学要求更好的解决方案。@JoeSlater:在这种情况下,你可能需要告诉我们更多关于真实问题的信息,以便我们能够帮助设计出更好的解决方案。非常好@Jerry。我将修改原来的帖子。我不太确定使用十六进制代码将如何帮助解决我的问题;如果只是为了帮助动态替换,那么反斜杠已经做到了。正则表达式的动态和递归生成肯定是必需的,但我希望有一种方法可以避免这种情况。@JoeSlater查看演示。字符类中的十六进制代码确实有效。我意识到字符类中的十六进制代码在@vks中起作用,我确实看过演示。[A-\x43]也可能是[A-C]——但这两种规范都不能解决我的问题。我担心@John就是这种情况。我只是希望,也许有一个正则表达式可以被使用,我忽略或不知道。
s.length()==3 && s[0] >= s[1] && s[1] <= s[2]