ভিম রেজেক্সে '\ zs' এবং '\ @ <=' পরমাণুর মধ্যে পার্থক্য কী?


12

ডকুমেন্টেশন থেকে এটিই আমি পেয়েছি: \zsপূর্ববর্তী রেজেক্সের সাথে মিলে যাওয়ার পরে "হাইলাইটেড অংশটি শুরু হয়", এবং \@<=পূর্ববর্তী পরমাণুর সাথে মিলের পরে "হাইলাইটেড অংশটি শুরু করে" । তবে আমি এর সূক্ষ্মতাগুলি হুবহু বুঝতে পারি না, তাই কেউ কীভাবে ব্যাখ্যা করতে পারে যে তারা কীভাবে গভীরতার সাথে আরও কিছুটা আলাদা হয়?

এটিই আমাকে কৌতূহলযুক্ত করেছিল: যদি আমি চালাই

/\_s\zsnnoremap

উদাহরণস্বরূপ nnoremapকোনও স্থান বা একটি প্রারম্ভকালীন লাইনের পূর্বে নির্বাচন করুন (অর্থাত্ পূর্ববর্তী রেখাটি থেকে নতুন লাইন, সুতরাং \_পূর্ববর্তী s) এবং তারপরে gnভিজ্যুয়াল মোডে প্রবেশের জন্য দৌড়ান এবং পরের ম্যাচটি দৃশ্যত নির্বাচন করুন, কোনও কারণে কেবল প্রথম কলামটি (যেমন) প্রথম nমধ্যে nnoremap) নির্বাচিত করা হয় - যে সমগ্র সত্ত্বেও nnoremapশব্দ হাইলাইট সঙ্গে :hlsearchচালু হয়েছে।

তবে আমি যদি এর পরিবর্তে অনুসন্ধান চালাই

/\_s\@<=nnoremap

এবং তারপরে চেষ্টা করুন gn, nnoremapপুরোটি সঠিকভাবে নির্বাচিত। এখানে কি হচ্ছে হতে পারে? আমি (আমি সাহস করে) কিছু অস্পষ্ট বাগ আবিষ্কার করেছি?


আমি মনে করি এটির মধ্যে :h patternsতবে আমার স্মৃতিটি সুপারিশ করে যে রেজেক্সগুলি পরমাণুর সমন্বয়ে গঠিত, যদি এটি তফাতটি ব্যাখ্যা করতে সহায়তা করে।
ডি বেন নোবল

উত্তর:


15

দেখে মনে হচ্ছে আপনি সত্যিই একটি অস্পষ্ট বাগ খুঁজে পেয়েছেন। আমি gn২০১২ সালে ভিম .3.৩ কিছুর জন্য টেক্সটোজেক্টটি বাস্তবায়ন করেছি। এটি মূলত নিম্নলিখিত পদ্ধতিতে কাজ করে:

1) এটি বর্তমান নিয়মিত প্রকাশের শেষ ম্যাচের জন্য পিছনে সন্ধান করে।

2) এটি বর্তমানের নিয়মিত প্রকাশের পরবর্তী ম্যাচের জন্য অনুসন্ধান করে।

এটি পরিষ্কার করে দেওয়া উচিত, কার্সারটি পরবর্তী ম্যাচের শুরুতে হবে, যদিও এটি ইতিমধ্যে 1 এর শুরুতে ছিল)। পরিশেষে

3) এটি বর্তমানের নিয়মিত এক্সপ্রেশনটির শেষ সন্ধান করে। এবং কার্সার সেখানে রাখে।

এখন এখানে যা ঘটে তা হ'ল বর্তমান ম্যাচের শেষের সন্ধানটি চারপাশে গুটিয়ে যায় এবং আগের ম্যাচের শেষ দিকে ফিরে যায় (কারণ wrapscanইতিমধ্যে সেট হয়ে গেছে, 1 এর জন্য অক্ষম হওয়ার পরে))। এরপরে এটি শুরু (2 পয়েন্টের শেষে) থেকে অঞ্চলটিতে ভিজ্যুয়াল চিহ্নিতকারীকে সেট করে এবং অঞ্চলটি পরবর্তী অনুসন্ধান আইটেম 3 দ্বারা সরানো হয়েছিল।

আমি সমস্যাটি ঘনিষ্ঠভাবে দেখব এবং সম্ভবত পরে ভিমের জন্য একটি প্যাচ জমা দেব।

[আপডেট 22.05.2018] আমি এই আচরণটি ঠিক করার জন্য একটি প্যাচ লিখেছি এবং জমা দিয়েছি ।

[আপডেট 2 22.05.2018] এবং প্যাচটি প্যাচ স্তর 8.1.0018 হিসাবে মার্জ করা হয়েছে d

[22.10.2019 আপডেট করুন] ভিম প্যাচ 8.1.629 হিসাবে তৃতীয় ধাপটি আর সম্পাদিত হয় না। পরিবর্তে ভিমের ম্যাচের শুরুটি খুঁজে পাওয়ার পরে ম্যাচের শেষটি নির্ধারণ করতে পারেন (পদক্ষেপ 2)


8

খ্রিস্টান বগী আচরণের প্রশ্নটিকে পুরোপুরি সম্বোধন করেছে gn, \zsএবং এখনও এবং এর মধ্যে মৌলিক পার্থক্য রয়েছে \@<=। সর্বাধিক সত্তা \@<=পূর্ববর্তী পরমাণুকে সংশোধন করে, অন্যদিকে \zsএটি একটি পরমাণু।

বিবেচনা:

Xnnoremap

\%1cX\zsnnoremap     (regex 1)
\%1cX\@<=nnoremap    (regex 2)
\%2cX\@<=nnoremap    (regex 3)

রেজেক্স 1 টি ম্যাচ, যেহেতু \%1cকলাম 1 টি মিলছে এবং সেখানে একটি এক্স রয়েছে। \zsকেবল ম্যাচটি এক্সের পরে কোনও অবস্থানে পুনরায় শুরু করার কারণ ঘটায়

রেজেজ 2 যদিও মেলে না, কারণ যদিও \%1cপ্রথম কলামটির সাথে মেলে যদিও X\@<=শূন্য প্রস্থ (ডকুমেন্টেশনে উল্লিখিত) এবং nnoremapকলাম 2 এ শুরু হয়। এবং কলাম 1 এবং 2 এর মধ্যে অবস্থানের পার্থক্য তৈরি করার মতো কিছুই নেই।

nnoremapকলাম 2-এ শুরু হওয়ার পর থেকে রেজেক্স 3 টি ম্যাচ ।


1
আমি মনে করি না রেজেক্স 2 ব্যর্থ হয়েছে কারণ 1 এবং 2 কলামের মধ্যে অবস্থানের পার্থক্য তৈরি করার মতো কিছুই নেই that যদি এটি সমস্যা ছিল nnoremapতবে রেজেক্স থেকে অপসারণ একটি মিল তৈরি করবে; কিন্তু রেজেক্স এমনকি এখনও ব্যর্থ হয়। আমি মনে করি এটি ব্যর্থ হয়েছে কারণ \%1cX\@<=এমন একটি অবস্থানকে প্রকাশ করে যা বিদ্যমান থাকতে পারে না। \%1c1 কলামে অবস্থানের সাথে মেলে এবং এর আগে X\@<=একটি চরিত্রের Xসাথে মেলে বলে। তবে প্রথম কলামের আগে কোনও চরিত্র থাকতে পারে না। যে কারণে আপনি যদি Xকোনও বিন্দু (যে কোনও চরিত্র) দিয়ে প্রতিস্থাপন করেন তবে রেজেক্স \%1c.\@<=এখনও ব্যর্থ হয়।
ব্যবহারকারী 938271

4

\zsপুরো নিয়মিত অভিব্যক্তিতে প্রয়োগ হয় এবং পরবর্তী অক্ষরটিকে পুরো ম্যাচের প্রথম চরিত্র হিসাবে সেট করে। \zsমিলের পাঠ্যের অংশ হিসাবে ইচ্ছার আগে যে কোনও কিছুই অন্তর্ভুক্ত করা হবে না।

\@<=অন্যদিকে, কেবলমাত্র এটির চারপাশের পরমাণুগুলিকে সরাসরি প্রভাবিত করে, আপনাকে এটি নির্দিষ্ট করতে দেয় যে পরবর্তী পরমাণুটি কেবল পূর্ববর্তী পরমাণুর অনুসরণ করলেই মিলবে। সুতরাং উদাহরণস্বরূপ, নিয়মিত প্রকাশ:

\vbar.*(foo)@<=bar

দুটি পাঠ্যের bar(সমস্ত উদাহরণগুলি নিজেরাই) এর মধ্যে সমস্ত পাঠ্য মিলবে , তবে কেবলমাত্র দ্বিতীয়টির আগে থাকে foo। অর্থাৎ এটি মিলবে:

barbazfoobar

কিন্তু না:

barbazbazbar

কারণ \@<=এইভাবে স্থানীয়করণ করা হয়েছে, আপনি এমনকি \@<=একক প্রকাশে একাধিকবার ব্যবহার করতে পারেন :

\vbar.*(foo)@<=bar.*(foo)@<=bar

নিম্নলিখিতটি তিনটি উদাহরণের সাথে মিলবে barতবে কেবলমাত্র দ্বিতীয় দুটি যদি পূর্ববর্তী হয় foo

যেমন পাঠ্য দেওয়া:

barfoobarbazfoobar
barfoobarbazbazbar
barbazbarbazfoobar

এটি কেবল প্রথম লাইনের সাথে মিলবে।


কিন্তু আপনি প্রথম lookbehind বিনিময় করতে পারেন \zs, অর্থাত্, এই কাজ করা উচিত: \vfoo\zsbar.*(foo)@<=bar
কার্ল ইংভে লেরভেগ

@ কার্লইংভেলেভের্গ ভাল পয়েন্ট আমি স্বতন্ত্র পার্থক্যটি তৈরি করতে এবং এমন উদাহরণগুলি ব্যবহার করতে গিয়ে সম্পাদনা করেছি যেখানে \zsএকেবারেই প্রতিস্থাপন করা যায় না।
ধনী

সুতরাং, আমার বোঝার জন্য, \zsএবং \zeরেগেক্স প্যাটার্নগুলির চারপাশের চেহারা দিয়ে প্রতিস্থাপন করা যেতে পারে এবং তারা আরও শক্তিশালী, তাই না? আরও শক্তিশালী কারণ এগুলি একাধিকবার ব্যবহৃত হতে পারে এবং এর সাথে গ্রুপ করা যায় \(\)। এবং এ কারণেই তারা রেগেক্সের চারপাশে পার্লের লুকের মতো কাজ করে। কিছু ভুল হয়েছে?
ক্লাউস

1
@ ক্লেউস এটি আমার কাছে সঠিক বলে মনে হচ্ছে (যদিও আমি কোনও বিশেষজ্ঞ নই)। মনে রাখবেন যে আপনার যখন \zs/ \zeআপনি যখন ব্যবহার করতে পারেন তবে তা ব্যবহার করা উচিত কারণ তারা চারপাশের চেয়ে দ্রুত।
ধনী

বুঝতে পারছিল না। এবং \zsএবং \zeস্পষ্টতই আরও স্বজ্ঞাত। ব্যাখ্যার জন্য ধন্যবাদ।
ক্লাউস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.