11 Mart 2019 Pazartesi

Düzenli İfadeler (Regular Expressions) ile Positive Lookbehind - Belli Karakter İle Başladığı

Giriş
Bu düzenli ifadeye (?<=subexpression) şeklinde yazılır. Positive lookbehind parantez içinde yazılmasına rağmen düzenli ifadedeki eşlemeye dahil edilmez. Yani non-consuming kabul edilir. Açıklaması şöyle.
For a match to be successful, subexpression must occur at the input string to the left of the current position, although subexpression is not included in the match result. A zero-width positive lookbehind assertion does not backtrack.

Zero-width positive lookbehind assertions are typically used at the beginning of regular expressions. The pattern that they define is a precondition for a match, although it is not a part of the match result.
Lookbehind + Lookahead Birlikte Kullanılırsa
Lookbehind + X + Lookahead şeklinde kullanılırsa x'leri capture eder.

Örnek - Lookbehind + Lookahead
Elimizde şöyle bir kod olsun. Önünde sayı, ardında yine bir sayı olan boşlukları siler.
string test = "Some Words 1 2 3 4";
string result = Regex.Replace(test, @"(?<=\d)\s+(?=\d)", "");
Çıktı olarak şunu alırız.
Some Words 1234
Örnek - Lookbehind + Lookahead
Elimizde şöyle bir kod olsun.
"(?<=[a-z])(?=[A-Z])|(?<=[0-9])(?=[A-Za-z])|(?<=[A-Za-z])(?=[0-9])|(?<=\\W)(?=\\W)");
Açıklaması şöyle. Split için boundary bulmak istersek önünce örneğin rakam, arkasında harf olan karakteri bulabiliriz.
what precedes is a lowercase, and what follows is an uppercase (or vice-versa)
what precedes is a digit and what follows is a letter (or vice-versa)
what precedes and what follows is a non word character (e.g. quote, parenthesis, etc.)
Örnek - Lookbehind + Lookahead
Kotlin'de şöyle yaparız. Arkasında x önünde o olarak veya Arkasında o önünde x olan yerlerden böler.
val str = "xxoooooooxxoxoxooooo"
val reg = Regex("(?<=x)(?=o)|(?<=o)(?=x)")
var list = str.split(reg)
println(list) 
// => [xx, ooooooo, xx, o, x, o, x, ooooo]

Hiç yorum yok:

Yorum Gönder