2013-01-23 63 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