2013-01-23 57 views
0

我将在JavaScript中实现RegExp。RegExp代码,用于在字符串中查找等距字符

我认为解释这个最好的方法就是一个例子。如果搜索字符串是

'abc' 

和草垛是

'auaisdgbbhbcsccddciubbffs' 

的模式需要打:

'[a]uaisdg[b]bhbcsc[c]ddciubbffs' and 
'au[a]isdgb[b]hbcsc[c]ddciubbffs' 

,并返回这些字符的位置...

甚至可以使Regex做出这样的事情吗?

+1

哪种语言,你试过了什么? – Anirudha

+1

我不能得到你想要的正则表达式只用你的例子实现的规则。你能提供一个不太复杂的吗?例如,什么应该“azbzcz”,“abc”,“aabbcc”和“aazbzcc”匹配? – sp00m

+0

我不认为正则表达式本身可以做到这一点,除非你知道字符之间的最大空间(然后你可以做一个冗长,详尽,丑陋的正则表达式)。更好的方法可能是解析字符串,计算第一个和第二个匹配字母之间的字符,然后搜索第三个字符。 – iamnotmaynard

回答

1

鉴于我们不知道你正在使用的编程语言,这是不可能提供在这一点上一个明确的答案。

这就是说,我不知道任何正则表达式构造会允许这种匹配。

如果我理解正确,你想找到一个'a',例如后面跟着一个'b'六个字符。然后,由于'b'在'a'之后出现了六个字符,所以您希望在'b'之后找到一个'c'六个字符。本质上,你想要backreferences,但你只想匹配反向引用的长度而不是实际的文本。我不认为这是正常表达式可能的。

有可能是一些正则表达式的实现有一个不寻常的结构允许这个,所以了解你的平台会有所帮助。

UPDATE

JavaScript有least powerful regex实现在那里的一个。我认为你不能用纯正则表达式来做到这一点。您需要编写一些额外的代码(并且我会诚实地为您的简单示例推荐一种“仅限代码”方法)。

+0

op想要均匀间隔a,b,c字符..他从来没有说过在最后一场比赛后n次完全匹配一个字符..我猜op应该澄清他的问题 – Anirudha

+0

@ Some1.Kill.The.DJ - 你需要阅读“在线之间”。 OP的例子是“均匀间隔”,即匹配字符的距离完全相同。对于OP来说,说“等间距”会更准确,但意图是清楚的(对我来说)。 – JDB

+0

感谢Cyborgx37!这回答我怀疑:RegExp不是最好的解决方案。 – Romi

1

如果我正确理解你的问题,这样的正则表达式可能的工作:

"(a).{6}(b).{6}(c).{6}.*" 

你想加入群1,2,和3

既然你没有指定语言,考虑蟒蛇下面的示例中使用字符串你给上面:

>>> q = re.compile(r"(a).{6}(b).{6}(c)") 
>>> s1 = 'auaisdgbbhbcsccddciubbffs' 
>>> s2 = 'auaisdgbbhbcsccddciubbffs' 
>>> res1 = q.findall(s1) 
>>> res2 = q.findall(s2) 
>>> print res1, res2 
[('a', 'b', 'c')] [('a', 'b', 'c')] 
>>> for r in res1: 
    print ''.join(r) 

abc 
>>> for r2 in res2: 
    print ''.join(r) 

abc 
+0

+1'6'是一个任意的数字,但是如果正则表达式是在for循环中构造的并且应用了多次不同宽度的数据,它可能对OP有用。效率不高,但可以完成工作。 – JDB

0

在Perl中,你可以返回使用$ + [1]等

匹配的位置

例如

$x=qqqafkewibslspcfjfjfj; 
$x=~/(a).*(b).*(c)/; 
print 'a was at: ' . $+[1] . ' b was at: ' . $+[2] . ' c was at:' . $+[3];" 

给我:

a was at: 4 b was at: 10 c was at:15 
+0

OP从此更新了他/她的问题以表明JavaScript是语言。 – JDB