2011-10-31 55 views
15

câu hỏi nhanh: mẫu của tôi là một chuỗi svg và có vẻ như l 5 0 l 0 10 l -5 0 l 0 -10 Để thực hiện một số so sánh không so sánh với tham chiếu tôi cần phải bỏ tất cả trừ l đầu tiên Tôi biết tôi có thể mương tất cả chúng và đặt một 'l' trả trước, hoặc tôi có thể sử dụng chất nền. Nhưng tôi tự hỏi là có một thành ngữ regexp javascript cho điều này?Làm thế nào để thay thế tất cả NHƯNG sự xuất hiện đầu tiên của một mẫu trong chuỗi

+0

L đầu tiên có luôn ở đầu chuỗi không? –

+0

tôi biết bạn nói rằng bạn không muốn điều này, nhưng chuỗi con đến không gian đầu tiên có vẻ như dễ nhất để đọc và duy trì. – Randy

+0

@Mark có cho usecase này, nó thậm chí là 'l', nhưng điều đó cũng làm việc với lookahead tiêu cực. –

Trả lời

24

Bạn có thể thử một lookahead tiêu cực, tránh sự bắt đầu của chuỗi:

/(?!^)l/g 

Xem nếu trực tuyến: jsfiddle

+0

Yea này dường như cảm ơn bạn! –

+0

Tôi đang cố gắng sửa đổi điều này để làm việc cho ký tự '-' đầu tiên xuất hiện và tôi đang gặp một thời gian rất khó khăn: (Bất kỳ sự trợ giúp nào được đánh giá cao. Cảm ơn trước. –

+0

Làm cách nào để sử dụng điều này với một biến? – Wlliam

-1

Something như thế này?

"l 5 0 l 0 10 l -5 0 l 0 -10".replace(/[^^]l/g, '')

+3

Mặc dù điều này không làm việc trong trường hợp này, không '^' đại diện cho ký tự chữ trong một lớp ký tự? – pimvdb

+2

'[^^]' khớp với bất kỳ ký tự nào ngoài ''^''. các ký tự ở bất kỳ điểm nào khác với đầu vào của đầu vào như bạn yêu cầu. (()/[^^] /. test ('^') && /[^^]/.test('x ')) === true' –

7

Không có JS RegExp để thay thế tất cả mọi thứ-nhưng-the-đầu-mẫu-match. Tuy nhiên, bạn có thể thực hiện hành vi này bằng cách chuyển một hàm làm đối số thứ hai cho phương thức replace.

var regexp = /(foo bar)(red)/g; //Example 
var string = "somethingfoo bar red foo bar red red pink foo bar red red"; 
var first = true; 

//The arguments of the function are similar to $0 $1 $2 $3 etc 
var fn_replaceBy = function(match, group1, group2){ //group in accordance with RE 
    if (first) { 
     first = false; 
     return match; 
    } 
    // Else, deal with RegExp, for example: 
    return group1 + group2.toUpperCase(); 
} 
string = string.replace(regexp, fn_replaceBy); 
//equals string = "something foo bar red foo bar RED red pink foo bar RED red" 

Chức năng (fn_replaceBy) được thực hiện cho mỗi trận đấu. Tại trận đấu đầu tiên, hàm trả về ngay lập tức với chuỗi được kết hợp (không có gì xảy ra) và cờ được đặt.
Mỗi trận đấu khác sẽ được thay thế theo logic như được mô tả trong hàm: Thông thường, bạn sử dụng $0 $1 $2, v.v., để tham khảo lại nhóm. Trong fn_replaceBy, đối số hàm bằng các đối số sau: Đối số đầu tiên = $0, đối số thứ hai = $1, v.v.

Chuỗi con phù hợp sẽ được thay thế bằng giá trị trả lại của hàm fn_replaceBy. Việc sử dụng hàm làm tham số thứ hai cho số replace cho phép các ứng dụng rất mạnh mẽ, chẳng hạn như intelligent HTML parser.

Xem thêm: MDN: String.replace > Specifying a function as a parameter

+0

Tôi không tin rằng "trình phân tích cú pháp HTML thông minh" sẽ không liên kết đến câu trả lời "phân tích cú pháp HTML bằng regex", haha. Nhưng câu trả lời rất hay, đây chỉ là những gì tôi cần. :) – henrebotha

2
"l 5 0 l 0 10 l -5 0 l 0 -10".replace(/^\s+/, '').replace(/\s+l/g, '') 

đảm bảo các 'l' đầu tiên không được đi trước bởi không gian và loại bỏ bất kỳ không gian tiếp theo là một 'l'.

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