Javascript რეგექსი ორ სიმბოლოს დასაჭერად ორი დელიმიტერის შორის
რედაქტირებული
მჭირდება ვიპოვო ორი სიმბოლო '[', ']' და '/', '/' შორის Javascript-ის გამოყენებით.
მე ვ იყენებ ამ რეგექსს:
([^.][/[string]]|\/string\/)|(\[(string))|(\/(string))| ((string)\])|((string)\/)
რომელიც იღებს ორ სიმბოლოს მაგრამ იღებს მხოლოდ ერთს.
პრობლემა არის, როგორ შეიძლება გავაკეთო, რომ მხოლოდ ორი სიმბოლო მივიღო?
ასევე მინდა ზუსტად ორ სიმბოლოს მივიღო სტრიქონის შიგნით, ვფიქრობ არა მხოლოდ ზუსტი შესაბამისობა.
მაგ.
მომხმარებლის შეყვანა: dz აუცილებელია იპოვოს მხოლოდ ზუსტი მორგებები, რომლებიც შეიცავს „dz“, მაგალითად --> „dzone“, მაგრამ არა „dazone“. ამჟამად მე ვიღებ მორგებებს ორივე სტრინგზე, „dzone“ და „dazone“.
დემო: https://regex101.com/r/FEs6ib/1
პასუხი #1
თქვენ შეგიძლიათ არჩევითად გაიმეოროთ ნებისმიერი სიმბოლო გამყოფების გარდა, თავად გამყოფებებს შორის, და დაჭეროთ ჯგუფში ის, რასაც გჭირდებათ შენარჩუნება.
თუ გსურთ მრავალჯერადი მატჩები /dzone/dzone/, შეგიძლიათ დაადასტუროთ ბოლო გამყოფი მარჯვნივ, ნაცვლად იმისა, რომ მოიხსენიოთ ეს.
მატჩები არიან ჯგუფი 1-ში ან ჯგუფი 2-ში, სადაც შეგიძლიათ გადაამოწმოთ, თუ ისინი არსებობს.
\/[^\/]*(dz)[^\/]*(?=\/)|\[[^\][]*(dz)[^\][]*(?=])
ნიმუში ემთხვევა:
\/ემთხვევა/[^\/]*(dz)[^\/]*დაიჭირე dz ჯგუფი 1-ში სხვა კარაქტერებს შორის გარდა/(?=\/)დადებითი წინასწარი შემოწმება, დადასტურება/მარჯვნივ|ან\[შეესაბამება[[^\][]*(dz)[^\][]*დაიჭირეთ dz ჯგუფი 2-ში ოპციონალურ სიმბოლოებს შორის, რომლებიც არაა[და]-(?=])დადებითი წინსვლის შემოწმება, დაადგინეთ]მარჯვნივ
რეგექსის დემო
ეს ემთხვევა სიტყვაში dz-ის 1 შემთხვევას. თუ გსურთ მთელი სიტყვის დაემთხვეს, დასაკავებელი ჯგუფი შეიძლება გაფართოვდეს უარყოფილ სიმბოლოების კლასის წინ და შემდეგ, როგორც:
\/([^\/]*dz[^\/]*)(?=\/)|\[([^\][]*dz[^\][]*)(?=])
რეგექსის დემო
const regex = /\/[^\/]*(dz)[^\/]*(?=\/)|\[[^\][]*(dz)[^\][]*(?=])/g;
[
"[dzone]",
"/dzone/",
"/dzone/dzone/",
"/testdztest/",
"[dazone]",
"/dazone/",
"dzone",
"dazone"
].forEach(s =>
console.log(
`${s} --> ${Array.from(s.matchAll(regex), m => m[2] ? m[2] : m[1])}`
)
);თუ მხარდაჭერილია, თქვენ ასევე შეგიძლიათ დაყაროთ ყველა გამოჩენა dz განსაზღვრულ საზღვრებს შორის, იყენებთ საოჯახო შემოწმებებს უსასრულო რაოდენობის საკვანძით:
(?<=\/[^\/]*)dz(?=[^\/]*\/)|(?<=\[[^\][]*)dz(?=[^\][]*])
რეგექსის დემო
const regex = /(?<=\/[^\/]*)dz(?=[^\/]*\/)|(?<=\[[^\][]*)dz(?=[^\][]*])/g;
[
"[adzadzone]",
"[dzone]",
"/dzone/",
"/dzone/dzone/",
"/testdztest/",
"[dazone]",
"/dazone/",
"dzone",
"dazone"
].forEach(s => {
const m = s.match(regex);
if (m) {
console.log(`${s} --> ${s.match(regex)}`);
}
});