ভিআইএম এর রেজেক্স সিস্টেমটিতে দৃষ্টিনন্দন কি সম্ভব?


22

আমি ভিআইএম এ অনেক পরিস্থিতিতে পড়েছি যেখানে দৃষ্টিনন্দন বিবৃতি দেওয়া কার্যকর হবে। আমি মান lookaround সিনট্যাক্স ব্যবহার চেষ্টা করেছি ( (?=), (?!)ইত্যাদি ..) , কিন্তু এটা মনে হচ্ছে, তেজ এই সমর্থন করে না। এই জাতীয় বিবৃতিগুলির জন্য কি ভিআইমের একটি সমতুল্য বাক্য গঠন রয়েছে?

উত্তর:


29

"জুম" অ্যাঙ্করগুলি

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

উদাহরণ

  • foo\zsbarএর barআগে মিলবে foo( ম্যাচের fooঅংশ নয়)
  • foo\zebarম্যাচটি fooঅনুসরণ করবে bar( ম্যাচের barঅংশ নয়)
  • myFunction(\zs.*\ze)কোনও ফাংশন কলে প্যারামিটারগুলি মিলবে (প্রদর্শনের উদ্দেশ্যে, আমি লোভী বনাম অ-লোভী মিলের দিকে মনোযোগ দিচ্ছি না)

এটি ব্যবহার করা

:substituteকমান্ডটি ব্যবহার করার সময় এগুলি সবচেয়ে কার্যকর হয় useful উদাহরণস্বরূপ, আমি একটি ফাংশন কল মধ্যে পরামিতি প্রতিস্থাপন করতে চেয়েছিলেন myFunction()সঙ্গে foo:

:%s/myFunction(\zs.*\ze)/foo/

এটি ছেড়ে যাবে myFunction(এবং )অক্ষত থাকবে এবং এগুলি আপনার প্যাটার্নে ক্যাপচার করবেন বা আপনার প্রতিস্থাপনে সেগুলি পুনরাবৃত্তি করবেন কিনা তা নিয়ে আপনাকে চিন্তা করতে হবে না ।

আপনি ভিমের রেজেক্সের দৃষ্টিনন্দন বৈশিষ্ট্যটি ব্যবহার করে এটি করতে পারেন তবে এটি বেশ ছোঁয়াচে:

:%s/\(myFunction(\)\@<=.*\()\)\@=/foo/

(আমি দেখতে পাই যে এই বাক্য গঠনটি আমাকে প্রথমে যা করার চেষ্টা করছিলাম তা ভুলে যেতে বাধ্য করে))

আপনার এখনও মাঝে মাঝে নজরদারি দরকার

এখনও এমন পরিস্থিতি রয়েছে যেখানে আপনার নজরদারি দরকার। ব্যবহার \zsএবং \zeযেখানে আপনি সহজ পরিস্থিতিতে জন্য মহান আগে কিছু দ্বারা অনুসরণ টেক্সট মেলে দ্বারা অনুসরণ পর কিছু । তবে এটি যদি এর চেয়ে জটিল হয় তবে আপনাকে সম্ভবত ভারী চেহারার বাক্য গঠনতে আটকে থাকতে হবে।

মজার ব্যাপার

যদিও তারা যথেষ্ট কৃপণ, তবে ভিএম এর চেহারাগুলি পিসিআরই-র তুলনায় আরও শক্তিশালী! তারা পরিবর্তনশীল-দৈর্ঘ্যের নেতিবাচক চেহারাটির পিছনে সমর্থন করে, যার অর্থ আপনি দৃ as়ভাবে বলতে পারেন যে কিছু প্যাটার্ন যার দৈর্ঘ্য পূর্বনির্ধারিত নয় তা আপনার ম্যাচের আগে নয়

এটি মোটামুটি গণনা ব্যয়বহুল হিসাবে পিসিআরই এটি সমর্থন করে না। এটি ভিমে খুব একটা উদ্বেগ নয়, যেহেতু রেগেক্সের সর্বাধিক সাধারণ ব্যবহারের ক্ষেত্রে ইন্টারেক্টিভ অনুসন্ধান জড়িত থাকে যেখানে গণনার সময়টি ব্যবহারকারীর কাছে প্রায় দুর্ভেদ্য হয়। যদিও এটি যদি সিনট্যাক্স হাইলাইট করার জন্য ব্যবহৃত হয় তবে আপনি সম্ভবত এটি লক্ষ্য করবেন।

প্রাসঙ্গিক সহায়তা বিষয়

  • :help \zs
  • :help \ze
  • :help perl-patterns

আমি জুম অ্যাঙ্কারদের সম্পর্কে অবগত ছিলাম না। তাদের ব্যাখ্যা করার জন্য ধন্যবাদ।
চিরসবুজ

14

দেখে মনে হচ্ছে এটি সম্ভব। পার্ল থেকে ভিমে যাওয়ার জন্য একটি সাধারণ টেবিল রয়েছে।:h perl-patterns

9. Compare with Perl patterns               *perl-patterns*

Vim's regexes are most similar to Perl's, in terms of what you can do.  The
difference between them is mostly just notation;  here's a summary of where
they differ:

Capability                  in Vimspeak   in Perlspeak
----------------------------------------------------------------
force case insensitivity    \c            (?i)
force case sensitivity      \C            (?-i)
backref-less grouping       \%(atom\)     (?:atom)
conservative quantifiers    \{-n,m}       *?, +?, ??, {}?
0-width match               atom\@=       (?=atom)
0-width non-match           atom\@!       (?!atom)
0-width preceding match     atom\@<=      (?<=atom)
0-width preceding non-match atom\@<!      (?<!atom)
match without retry         atom\@>       (?>atom)

সুতরাং উদাহরণস্বরূপ যদি আপনার স্ট্রিং থাকে one two threeএবং আপনি oneকেবল <space>twoএটি অনুসরণ করতে পারেন তবে এটি ব্যবহার করতে পারেন match

/one\(\stwo\)\@=

এটি পার্ল সংস্করণের অনুরূপ

m/one(?=\stwo)/
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.