2011-01-09 39 views
5

ikinci oluşumunu değiştirin:,Regex (düzenli ifadeler) Bu çalıştı ediliyor dizesi örneği olan javascript

xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx] 

Bir maçın ikinci oluşumunu eşleşen bir sorun yaşıyorum ben 2. köşeli parantez içinde bir sayı ile dönmek istiyorum. Bir dizesinde sayılarla ilk kare backets bulmakta bazı regex vardır:

\[+[0-9]+\] 

Bu [7], ancak dönmek istiyorum döner [9].

(?:.*?(\[+[0-9]+\])){2} 

: Ben JavaScript'ın yerine fonksiyonunu kullanıyorum

aşağıdaki regex ikinci oluşumunu ([9]) regex testeing uygulamalarda, ancak işlevini yerine Javascript doğru değiştirilmemiştir maçları Benim sorum, yukarıdaki regex'i Javasctipt'de [9] değiştirmek için nasıl kullanırım veya köşeli parantez içindeki bir sayının ikinci oluşumuyla eşleşen başka bir normal ifade var mıdır.

Şerefe! xxx Eğer

cevap

3

sadece herhangi bir dize değil, mutlaka bir sayıdır, o zaman bu ne istediğinizi olabilir:

(\[[0-9]+\]\[.*?\])\[([0-9]+)\] 

Bu [] ikinci sayı arar. $1[<replacement>] ile değiştirin. Play with it on rubular. + ardından gruplar sadece son[xxx] tutan sona çünkü

normal ifadeniz istendiği gibi çalışabilmesi için başarısız olur. Birinci ve ikinci [digit] grup arasında [xxx] gruplarının sayısı değişkendir, daha sonra tarafından

result = subject.replace(/(\[\d\](?:\[[^\]]+\])*?)\[\d\]/, "$1[replace]"); 

kullanımı

(  # capture the following in backref 1: 
\[\d\] # first occurrence of [digit] 
\[  # [ 
[^\]]+ # any sequence of characters except ] 
\]  # ] 
)  # end of capturing group 
\[\d\] # match the second occurence of [digit] 

:

+0

Niçin '{3}' niceleyici olarak kullanıyorsunuz? Bu, "istediğimizden önce her zaman üç etiket olacak, ve bir durumdan sonra" ifadesinin, kuralın belirttiği asıl gereklilikler üzerine temellendirilmemesi gerektiği gibi görünmüyor. Şahsen ben/(\ [\ + + \] (?: \ [. *? \ D. *? \]) *) (\ [\ D + \])/\ 1 [replacement]/' –

+0

@ 'yi kullanırdım Anon Biz bilmiyoruz 'xxx' bir sayı değil. Öyle olduğunu düşündüm, ama yanılıyor olabilirim. – marcog

+0

İkinci '[]' yerini alacak başka bir normal ifade ekledim. – marcog

1

açıklamalı bir düzenli ifade olarak

result = subject.replace(/(\[\d\]\[[^\]]+\])\[\d\]/, "$1[replace]"); 

deneyinile eşleşen parçayı çevrelemekgrupları (yakalamayan) parantezler ve tembel niceleyici *?, regex motorunun mümkün olduğunca az sayıda grupla eşleşmesini istiyorum, ancak bir sonraki grup [digit] grubudur.

0
console.log("xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx]".replace(
/^(.*\[[0-9]+\].*)(\[[0-9]+\])(.*)$/, 
'$1[15]$3')); // replace with matches before ($1) and after ($3) your match ($2) 

verir: [n] içinde sayılar ile parantez 1 set önce geldiği yerde

// xxxxxx[xxxxxx][7][xxxxxx][15][xxxxxx] 

Bu eşleşir.

+0

Bunun önemli olup olmadığından emin değil, ancak bu [1] [2] [3] 'de başarısız olur - sonuncunun yerini alır [3]. Belki OP bazı testler yapmalı ... – Hemlock

İlgili konular