তালিকা হিসাবে বাফারে সমস্ত রেজিপ্সপ ম্যাচ পান


18

কোড গল্ফ স্ট্যাক এক্সচেঞ্জ সাইটে আজ, "একটি ওয়েবপৃষ্ঠায় সমস্ত লিঙ্ক পান" এই প্রশ্নের ক্লোজারে এই উত্তরটি পেয়েছি ।

(->> (slurp "http://www.stroustrup.com")
     (re-seq #"(?:http://)?www(?:[./#\+-]\w*)+"))

অভিনব ম্যাক্রো ছাড়া এটি কেবল এটি:

(re-seq #"(?:http://)?www(?:[./#\+-]\w*)+" (slurp "http://www.stroustrup.com"))

এটি তালিকাটি ফিরিয়ে দেয়:

("http://www.morganstanley.com/" "http://www.cs.columbia.edu/" "http://www.cse.tamu.edu" ...)

আমি কি ইমাস লিস্পে অনুরূপ কিছু করতে পারি?

সম্ভবত (re-seq regexp (buffer-string))যে একটি ফাংশন ফিরে '(firstmatch secondmatch thirdmatch ...)?


এটি যা M-x occurকরে, তবে আমি এটি করতে আরও নিম্ন-স্তরের ফাংশন সন্ধান করব।
wvxvw

@wvxvw এটি একটি ভাল বিষয়, আমি এমনকি এটি সম্পর্কে চিন্তাও করি না occur। আমি এর উত্স মাধ্যমে দেখতে হবে।
আয়া

আমি ভিতরে তাকালাম, ওঃ হায়, কোডটি খুব বেশি করে এবং এটিকে পুনরুক্তি করা সহজ নয়, মোটেও নয়। আমার পরবর্তী প্রার্থী হবে s.el, তবে সম্ভবত আরও কিছু আছে। এখানে: github.com/magnars/s.el#s-match-strings-all-regex- স্ট্রিং এ কেমন?
wvxvw

উত্তর:


16

অনুরোধ অনুযায়ী স্ট্রিংয়ের উপর ভিত্তি করে আপনি এটি কীভাবে করতে পারেন তা এখানে।

(defun re-seq (regexp string)
  "Get a list of all regexp matches in a string"
  (save-match-data
    (let ((pos 0)
          matches)
      (while (string-match regexp string pos)
        (push (match-string 0 string) matches)
        (setq pos (match-end 0)))
      matches)))

; Sample URL
(setq urlreg "\\(?:http://\\)?www\\(?:[./#\+-]\\w*\\)+")
; Sample invocation
(re-seq urlreg (buffer-string))

এটি পুরোপুরি সম্পূর্ণ নয় বলে মনে হচ্ছে, আপনি কি এটি পুরোপুরি কার্যকারী উত্তরে প্রসারিত করতে পারেন?
wasamasa

1
কোডটি সম্পূর্ণ ছিল, তবে আমি ব্যবহারের উদাহরণও যুক্ত করেছি। আপনি আর কি দেখতে চান?
অ্যালান শুটকো

1
দুর্ভাগ্যক্রমে এই সমাধানটি খুব সহজ। ব্যবহার করে দেখুন (re-seq "^.*$" "")। বৈধ regexp, বৈধ স্ট্রিং, কিন্তু এটি কখনও শেষ হয় না।
ফিল লর্ড

8

সম্ভবত এটি লক্ষণীয় যে occurসার্বজনীন যুক্তির সাহায্যে এটি *Occur*কেবল মিলের সাথে বাফারকে জনপ্রিয় করে তোলে - কোনও ফাইলের নাম, লাইন নম্বর বা শিরোনামের তথ্য। যখন কোনও ক্যাপচার গ্রুপের সাথে একত্রিত করা হয়, এটি একটিকে প্যাটার্নটি যা পছন্দসই তা নিষ্কাশনের অনুমতি দেয়।

উদাহরণস্বরূপ, C-u M-x occurএরপরে \"\(.*\)\"ব্যবহারকারী ক্যাপচার গ্রুপটিকে (ডিফল্ট \1) সংগ্রহ করার অনুরোধ জানাবে এবং তারপরে প্রতিটি উদ্ধৃত স্ট্রিংয়ের সামগ্রীটি *Occur*বাফারে রাখবে ।


5

আমার কাছে পোস্ট করা প্রশ্নের একটি ইমাস লিস্প উত্তর রয়েছে: /codegolf//a/44319/18848

বাফারে ম্যাচগুলিকে তালিকার সাথে ঠেকাতে এবং এটির মতো করে ফেরত দেওয়ার জন্য একই (অনুসন্ধানের সময় (মুদ্রণ)) কাঠামোটি ব্যবহার করে আপনি এটি কোনও ফাংশনে রূপান্তর করতে পারেন:

(defun matches-in-buffer (regexp &optional buffer)
  "return a list of matches of REGEXP in BUFFER or the current buffer if not given."
  (let ((matches))
    (save-match-data
      (save-excursion
        (with-current-buffer (or buffer (current-buffer))
          (save-restriction
            (widen)
            (goto-char 1)
            (while (search-forward-regexp regexp nil t 1)
              (push (match-string 0) matches)))))
      matches)))

নিস উত্তর, নোট আপনি প্রতিস্থাপন করতে চান হতে পারে match-stringসঙ্গে match-string-no-propertiesতাই সিনট্যাক্স হাইলাইট নিষ্কাশিত করা হয় না। আপনি কোনও পাসওয়ার্ডটি regexp-group-indexব্যবহার করতে চাইতে পারেন যাতে আপনি কোন পাঠ্যটি সঞ্চিত আছে তা চয়ন করতে পারেন। পাশাপাশি অনুসন্ধানের ক্রমটিকে বিপরীত করা (বর্তমান তালিকাটি সর্বশেষে প্রথমটি)। এই উত্তরটি দেখুন যার মধ্যে একটি পরিবর্তিত সংস্করণ রয়েছে emacs.stackexchange.com/a/38752/2418
ধারণাগুলি 42

3

এটি ব্যবহার s.elকরা আরও কম হত তবে দুর্ভাগ্যক্রমে এটি অনেক বেশি ম্যাচ দেয়:

(defun all-urls-in-buffer ()
  (s-match-strings-all
   "\\(?:http://\\)?www\\(?:[./#+-]\\w*\\)+"
   (buffer-string)))

যদি এটি ঠিক থাকে (ইউআরএলগুলির জন্য রেজেক্সগুলি যাইহোক নিখুঁত নয়) তবে এটি কেবল সংক্ষিপ্ত হতে পারে এবং যদি তা না হয় তবে আমি মনে করি না যে আমি এ্যালান শুটকের জবাবের চেয়ে ছোট করে তুলতে পারি।


2

আমাকে কেবল উল্লেখ করা যাক কেন আমি মনে করি এটি মূলতে প্রয়োগ করা হয়নি। কেবল দক্ষতার কারণে: অনুলিপি করা, তালিকা তৈরি করা, এগুলি চারপাশে পাস করা এবং আবর্জনা সংগ্রহ করার দরকার নেই। পরিবর্তে, পুরো স্ট্রিংটি বাফার হিসাবে সংরক্ষণ করুন এবং পূর্ণসংখ্যার মিলের সীমানা দিয়ে পরিচালনা করুন। এটি কীভাবে occurকাজ করে, উদাহরণস্বরূপ: এটি একবারে একটি স্ট্রিংয়ের সাথে মেলে এবং ম্যাচটি সন্নিবেশ করায় *occur*। এটি একই সাথে সমস্ত স্ট্রিংয়ের সাথে মেলে না, তাদের তালিকাতে তৈরি করুন, inোকাতে তালিকায় লুপ করুন *occur*এবং আবর্জনা তালিকা এবং তার স্ট্রিং সংগ্রহ করুন।

আপনি (do (def x 1) (def x (+ 2 x)))ক্লোজুরে যেমন লিখতেন না ঠিক তেমনই আপনাকে ডিফল্টরূপে এলিসপকে কার্যকরী ভাষার মতো আচরণ করার চেষ্টা করা উচিত নয়। আমি যদি এটি থাকতাম তবে তা পছন্দ করতাম তবে এই মুহুর্তে আমরা যা পেয়েছি তা আমাদের ঠিক করে দিতে হবে।


1

যদি আমাকে প্লাগের অনুমতি দেওয়া হতে পারে তবে আমার "এম-বাফার" লাইব্রেরিটি একবার দেখুন।

(m-buffer-match buffer "foo")

মিলগুলিতে চিহ্নিতকারীদের একটি তালিকা ফেরত দেয় foo

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