বর্তমান চরিত্রটি একটি অক্ষর কিনা তা কীভাবে নির্ধারণ করবেন


9

আমি কীভাবে নির্ধারণ করতে পারি যে বর্তমান অক্ষরটি একটি বর্ণ (একটি বর্ণানুক্রমিক চরিত্র) (অর্থাত্, [:alpha:]রিজেক্সেপ ধারণার মধ্যে সিনট্যাক্স শ্রেণীর অন্তর্গত )। আমি নীচের মত একটি সাধারণ ফাংশন লিখতে চাই:

(defun test-letter () (interactive)
(if char-after-is-a-letter
    (message "This is a letter")
    (message "This is not a letter")
    )
)

আপডেট দুর্ভাগ্যক্রমে অক্ষরের শ্রেণীর সমতুল্যতা এবং সিনট্যাক্স ক্লাস সম্পর্কে আমার ধারণাটি [:alpha:]মিথ্যা বলে মনে হচ্ছে।

উত্তর:


9

ইউনিকোড চর বৈশিষ্ট্য ব্যবহার করুন

এটি অবশ্যই কাজ করবে:

(memq (get-char-code-property (char-after) 'general-category)
      '(Ll Lu Lo Lt Lm Mn Mc Me Nl))

বোনাস হিসাবে এটিও দ্রুত হওয়া উচিত looking-at


ইম্যাকস ইউনিকোড স্ট্যান্ডার্ড দ্বারা নির্দিষ্ট সমস্ত অক্ষরের বৈশিষ্ট্য সংরক্ষণ করে। তারা সাথে অ্যাক্সেসযোগ্য get-char-code-property। বিশেষত, general-categoryসম্পত্তি বর্ণগুলি বর্ণগুলি ( Llছোট ছোট, Luবড় হাতের অক্ষর, এবং অন্যেরা কী তা আমাকে জিজ্ঞাসা করবেন না) নির্দিষ্ট করে specif


অনেক ধন্যবাদ, এটি সমস্যার সমাধান করে ۱۲۳۴۵۶۷۸۹۰তবে কিছু সত্য-নেতিবাচক রয়েছে যেমন, আরবী বা হিব্রু আলেফ: א, ا
নাম

@ নাম স্থির। আবার চেষ্টা করুন.
মালবারবা

2
আবার আপনাকে ধন্যবাদ. আমি এটি বিভিন্ন বর্ণমালা দিয়ে পরীক্ষা করেছি এবং এটি কাজ করে। একমাত্র ব্যতিক্রম আমি দেখেছি এই ধরনের চীনা কিছু এশিয়ান বর্ণমালা সাথে আছেন en.wikipedia.org/wiki/Chinese_numerals বা জাপানি en.wikipedia.org/wiki/Japanese_numerals । উদাহরণস্বরূপ জাপানি সংখ্যা হিসাবে বিবেচনা করা হয় 5। আপনার কোড এটি একটি চিঠি বিবেচনা করে। হতে পারে এটি একটি চিঠি (রোমান সংখ্যার মতো v)। সম্ভবত জাপানের সাথে পরিচিত কেউ এটি যাচাই করতে পারেন।
নাম

1
এটি ইংরেজি শব্দের মতো five, সুতরাং এটি একটি চিঠি। পাঁচটি শব্দের পরিবর্তে 5 নম্বর লেখার সময় তারা 5কেবল ইংরেজের মতো ব্যবহার করে ।
মুর

8

সম্পাদনা: এই উত্তরটি 25.5 (যেখানে বাগটি ঠিক করা হয়েছিল) এ পুরোপুরি বৈধ হওয়া উচিত । পুরানো সংস্করণগুলির জন্য, অন্য বিকল্পটি ব্যবহার করুন ।


এটি আপনাকে বলা উচিত যে বর্তমান চরটি কোনও চিঠি এবং কোনও ভাষায় কাজ করা উচিত।

 (looking-at-p "[[:alpha:]]")

অনেক ধন্যবাদ, আমি looking-at-pআপনার সমাধান এবং looking-atঅন্যান্য উত্তরে ব্যবহৃত পার্থক্য সম্পর্কে মাত্র কৌতূহলী ।
নাম

1
দুটি ফাংশন সমান, এটি বাদে looking-at-pডেটা সেট করে না।
jch

1
@ নাম দেখানো পি পি একটি খাঁটি শিকারীর কাছাকাছি, কারণ এটি ম্যাচের ডেটা সেট করে না। আপনি যদি আগে অনুসন্ধান-ফরোয়ার্ডের মতো কিছু সম্পাদন করে থাকেন, match-string(এবং এর অনেক সহোদর) অনুসন্ধানের ফলাফলটি ফিরিয়ে দেবে। এদিকে, প্রিনিকেটবিহীন সংস্করণ সহ, ম্যাচ-স্ট্রিংটি সন্ধানী ম্যাচের ফলাফলটি ফিরিয়ে দেবে।
মালবারবা

5

আমি মনে করি আপনি এটির সাথে পালাতে পারবেন:

(defun test-letter ()
  (interactive)
  (let ((char (char-after)))
    (if (and (eq (char-syntax char) ?w)
             (or (> char ?9)
                 (< char ?1)))
        (message "This is a letter")
      (message "This is not a letter"))))

হালনাগাদ

এটি একটি কম দক্ষ তবে আপনি যা চান তার কাছাকাছি:

(defun test-letter ()
  (interactive)
  (if (looking-at "[a-z-A-Z]")
      (message "This is a letter")
    (message "This is not a letter")))

ধন্যবাদ, একটি সম্ভাব্য সমস্যা: এই ফাংশনটি একটি সংখ্যা হিসাবে (123 ...) বিবেচনা করে।
নাম

সহজেই স্থিরযোগ্য।
Abo-abo

আবার অনেক ধন্যবাদ। অন্য একটি মিথ্যা ইতিবাচক: এটি ۹(অর্থাত্, ভারতীয় অঙ্ক 9) বা ٪একটি চিঠি হিসাবে বিবেচনা করে।
নাম

1
আপনার প্রথম সমাধানটি গ্রীক অক্ষরের (যেমন ζবা α) দিয়ে ভাল ছিল, তবে আপডেটটি তা নয়।
নাম

তবে উভয়ের সংমিশ্রণই একটি নিবিড় সমাধান।
নাম

2

আপনি যদি জাতীয় চরিত্রগুলি এবং ইউনিকোড চরিত্রের ক্লাসগুলির সুনির্দিষ্ট চিকিত্সা সম্পর্কে খুব চিন্তিত হয়ে থাকেন তবে আমি এখন পর্যন্ত কেবলমাত্র সমাধানটি পাই পাইথন regexগ্রন্থাগারটি । উভয় grepএবং Perl(আমার সম্পূর্ণ অবাক!) কাজটি সঠিকভাবে করেনি।

সুতরাং, রেগুলার এক্সপ্রেশন তোমার পরে এই এগুলির মধ্যে একটি: \p{L}। এটি ইউনিকোড সম্পত্তি শর্টহ্যান্ড সংস্করণ হিসাবে পরিচিত, পুরো সংস্করণটি হ'ল \p{Letter}বা এমনকি p\{General_Category=Letter}Letterএটি নিজেই একটি যৌগিক শ্রেণি, তবে আমি বিশদে যাব না, এই বিষয়ে আমি যে সর্বোত্তম রেফারেন্স পেয়েছি তা এখানে

পাইথন গ্রন্থাগারটি ভাষা অন্তর্নির্মিত নয় (এটি অন্তর্নির্মিত reলাইব্রেরির বিকল্প )। সুতরাং, আপনার এটি ইনস্টল করা প্রয়োজন, উদাহরণস্বরূপ:

# pip install regex

তারপরে, আপনি এটি এর মতো ব্যবহার করতে পারেন:

import regex
>>> regex.match(ur'\p{L}+', u'۱۲۳۴۵۶۷۸۹۰')
>>> regex.match(ur'\p{L}+', u'абвгд')
<regex.Match object; span=(0, 5), match=u'\u0430\u0431\u0432\u0433\u0434'>
>>> regex.match(ur'\p{L}+', u'123')
>>> regex.match(ur'\p{L}+', u'abcd')
<regex.Match object; span=(0, 4), match=u'abcd'>
>>> 

আপনি এই স্ক্রিপ্টটি এমন কোনও জায়গায় রাখতে পারেন যেখানে আপনি এটি অ্যাক্সেস করতে পারবেন:

#!/usr/bin/env python
import regex
import sys

if __name__ == "__main__":
    for match in regex.finditer(ur'\p{L}+', sys.argv[1].decode('utf-8')):
        print match.string

এবং ইমাক থেকে এটি কল করুন (ধরুন আপনি এই স্ক্রিপ্টটি এতে সংরক্ষণ করেছেন ~/bin):

(defun unicode-character-p ()
  (interactive)
  (let* ((current (char-after (point)))
         (result (shell-command-to-string
                  (format "~/bin/is-character.py '%c'" current))))
    (message
     (if (string= result "") "Character %c isn't a letter"
        "Character %c is a letter")
     current)))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.