2011-01-09 31 views
5

Đây là một ví dụ về chuỗi đó là được làm việc với:Regex (biểu thức thông thường), thay thế sự xuất hiện thứ hai trong javascript

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

Tôi đang gặp một chút rắc rối phù hợp với sự xuất hiện thứ hai của trận đấu, tôi muốn trả lại dấu ngoặc vuông thứ 2 với một số bên trong. Tôi có một số regex tìm các ô vuông đầu tiên với các số trong một chuỗi:

\[+[0-9]+\] 

Điều này trả về [7], tuy nhiên tôi muốn trở về [9].

Tôi đang sử dụng thay thế chức năng Javascript của, regex sau phù hợp với sự xuất hiện thứ hai ([9]) trong các ứng dụng testeing regex, tuy nhiên nó không phải là thay thế một cách chính xác trong javascript thay thế chức năng:

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

Câu hỏi của tôi là làm thế nào để tôi sử dụng regex ở trên để thay thế [9] trong Javasctipt hoặc có một regex khác khớp với sự xuất hiện thứ hai của một số trong dấu ngoặc vuông.

Chúc mừng!

Trả lời

3

Nếu xxx chỉ là bất kỳ chuỗi, và không nhất thiết là một số, thì đây có thể là những gì bạn muốn:

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

này trông cho số thứ hai trong []. Thay thế nó bằng $1[<replacement>]. Play with it on rubular.

Cụm từ thông dụng của bạn không hoạt động như dự định vì các nhóm được theo sau bởi + chỉ kết thúc giữ lần cuối[xxx].

+0

Tại sao bạn sử dụng '{3} 'làm công cụ định lượng? Điều này dường như không phải là "luôn luôn có ba thẻ trước khi chúng tôi muốn, và một sau khi" tình hình, bạn không nên căn cứ vào các yêu cầu thực tế được đưa ra bởi người hỏi? Cá nhân, tôi sẽ sử dụng '/ (\ [\ d + \] (?: \ [. *? \ D. *? \]) *) (\ [\ D + \])/\ 1 [thay thế] /' –

+0

@ Anon Chúng tôi không biết rằng 'xxx' không phải là một số. Tôi cho rằng đó là, nhưng có lẽ tôi đã sai. – marcog

+0

Tôi đã thêm một regex khác sẽ thay thế thứ hai '[]'. – marcog

1

Hãy thử

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

Là một regex nhận xét:

(  # 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] 

Nếu số lượng [xxx] nhóm giữa nhóm [digit] đầu tiên và thứ hai là biến, sau đó sử dụng

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

Bằng xung quanh phần khớp với [xxx] nhóm có dấu ngoặc đơn (không bắt giữ) và số phân định lười biếng *? Tôi yêu cầu động cơ regex khớp với ít nhất trong số các nhóm đó, nhưng nhiều khi cần thiết để nhóm tiếp theo là nhóm [digit].

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) 

lợi nhuận:

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

Nó sẽ phù hợp với nơi [n] được preceeded bởi 1 bộ khung với những con số bên trong.

+0

Không chắc chắn nếu điều này là quan trọng, nhưng điều này không thành công trên [1] [2] [3] - thay thế [3] cuối cùng. Có lẽ OP nên cung cấp một số xét nghiệm ... – Hemlock

Các vấn đề liên quan