Theo ý tưởng của Mijoja và rút ra từ những vấn đề mà JasonS đã phơi bày, tôi đã có ý tưởng này; tôi đã kiểm tra một chút nhưng tôi không chắc về bản thân mình, vì vậy một xác minh của một người có chuyên môn hơn tôi trong js regex sẽ rất tuyệt :)
var re = /(?=(..|^.?)(ll))/g
// matches empty string position
// whenever this position is followed by
// a string of length equal or inferior (in case of "^")
// to "lookbehind" value
// + actual value we would want to match
, str = "Fall ball bill balll llama"
, str_done = str
, len_difference = 0
, doer = function (where_in_str, to_replace)
{
str_done = str_done.slice(0, where_in_str + len_difference)
+ "[match]"
+ str_done.slice(where_in_str + len_difference + to_replace.length)
len_difference = str_done.length - str.length
/* if str smaller:
len_difference will be positive
else will be negative
*/
} /* the actual function that would do whatever we want to do
with the matches;
this above is only an example from Jason's */
/* function input of .replace(),
only there to test the value of $behind
and if negative, call doer() with interesting parameters */
, checker = function ($match, $behind, $after, $where, $str)
{
if ($behind !== "ba")
doer
(
$where + $behind.length
, $after
/* one will choose the interesting arguments
to give to the doer, it's only an example */
)
return $match // empty string anyhow, but well
}
str.replace(re, checker)
console.log(str_done)
đầu ra cá nhân của tôi:
Fa[match] ball bi[match] bal[match] [match]ama
nguyên tắc là gọi checker
tại mỗi điểm trong chuỗi giữa hai ký tự bất kỳ, bất cứ khi nào vị trí đó là điểm bắt đầu của:
--- bất kỳ chuỗi con nào có kích thước của những gì không muốn (ở đây 'ba'
, do đó,..
) (nếu kích thước đó được biết; nếu không thì có lẽ khó thực hiện hơn)
--- --- hoặc nhỏ hơn nếu đó là phần đầu của chuỗi: ^.?
và, theo đó,
--- những gì thực sự được tìm kiếm (ở đây 'll'
).
Tại mỗi cuộc gọi của checker
, sẽ có một thử nghiệm để kiểm tra xem giá trị trước đó ll
có phải là giá trị chúng tôi không muốn ( !== 'ba'
); nếu đó là trường hợp, chúng ta gọi một hàm khác, và nó sẽ phải là hàm này ( doer
) sẽ tạo ra các thay đổi trên str, nếu mục đích là cái này, hay nói chung hơn, sẽ nhập dữ liệu cần thiết để xử lý thủ công kết quả quét của str
.
Ở đây, chúng tôi thay đổi chuỗi vì vậy chúng tôi cần phải theo dõi sự khác biệt về độ dài để bù lại các vị trí được cung cấp bởi replace
, tất cả được tính toán str
, mà chính nó không bao giờ thay đổi.
do các chuỗi nguyên thủy là bất biến, chúng ta có thể đã sử dụng biến str
để lưu trữ kết quả của toàn bộ hoạt động, nhưng tôi nghĩ ví dụ, đã phức tạp bởi các thay thế, sẽ rõ ràng hơn với một biến khác (str_done
).
Tôi đoán rằng về mặt biểu diễn thì nó phải khá khắc nghiệt: tất cả những sự thay thế vô nghĩa của '' thành '', this str.length-1
lần này, cộng với việc thay thế thủ công bằng cách làm, có nghĩa là rất nhiều lát cắt ... có thể trong trường hợp cụ thể ở trên có thể được nhóm lại, bằng cách cắt chuỗi chỉ một lần thành các phần xung quanh nơi chúng ta muốn chèn [match]
và .join()
ing nó với [match]
chính nó.
một điều nữa là tôi không biết làm thế nào nó sẽ xử lý các trường hợp phức tạp hơn, đó là các giá trị phức tạp cho giao diện giả mạo ... độ dài có lẽ là dữ liệu có vấn đề nhất.
và, trong checker
trường hợp có nhiều khả năng của các giá trị không mong muốn cho $ phía sau, chúng ta sẽ phải thực hiện một thử nghiệm với nó với một regex khác (được lưu trữ (tạo) bên ngoài checker
là tốt nhất, để tránh cùng một đối tượng regex được tạo tại mỗi cuộc gọi cho checker
) để biết liệu đó có phải là điều chúng ta tìm cách tránh hay không.
hy vọng tôi đã rõ ràng; Nếu không đừng ngần ngại, tôi sẽ cố gắng tốt hơn. :)