C ++ 11正则表达式使用后向引用作为条件

时间:2015-01-21 04:45:32

标签: regex c++11 character-class

我意识到后面的引用不能用在字符类中,但我需要这个功能。我想知道是否有可用于实现此目的的替代有效正则表达式。

前提:我使用的是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拼图(没有生成谜题)。

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

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以在字符类中使用十六进制代码。因此,一种方法是查找hex code$1的{​​{1}}并将其放在\1内。您必须在run.Sething上创建正则表达式

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

此处character class \x43是硬编码的。但您可以在替换它之前轻松找到它。

伪正则表达式可以

C

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

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

答案 3 :(得分:0)

感谢大家的投入。我决定使用混合方法......例如,如果开头的假设表达式是:

  

&#34; ^([A- \ 1])([\ 2-Z])$&#34(。);

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

  

&#34; ^([I-Z])([I])([I-Z])$&#34;

可用作有效的正则表达式来匹配&#34; PIT&#34;或者&#34; SIT&#34;。