رشته - چگونه در جاوااسکریپت بررسی کنیم که یک کاراکتر حرف است؟


من یک کاراکتر را در یک رشته جاوااسکریپت استخراج میکنم با:

var first = str.charAt(0);

و من میخواهم بررسی کنم که آیا این یک حرف است یا خیر. به طور عجیبی، به نظر نمیرسد چنین قابلیتی در جاوااسکریپت وجود داشته باشد. حداقل من نمیتوانم آن را پیدا کنم.

چطور میتوانم این را آزمایش کنم؟

پاسخ شماره ۱

من فکر نمیکنم تابعی داخلی برای آن وجود داشته باشد. اما نوشتن آن با یک عبارت منظم به اندازه کافی آسان است

function isLetter(str) {
  return str.length === 1 && str.match(/[a-z]/i);
}

پاسخ شماره ۲

با توجه به اینکه آن کاراکترهای ویژه توسط بررسیهای سادهتر مانند /[a-zA-Z]/.test(c) در نظر گرفته نمیشوند، مفید است که از تبدیل حروف ECMAScript (toUpperCase) استفاده شود. این کار کلاسهای کاراکتر غیر ASCII برخی الفباهای خارجی را در نظر خواهد گرفت.

function isLetter(c) {
  return c.toLowerCase() != c.toUpperCase();
}

توجه: این راهحل فقط برای بیشتر حروف لاتین، یونانی، ارمنی و سیریلیک کار خواهد کرد. این برای چینی، ژاپنی، عربی، عبری و بیشتر حروف دیگر کار نخواهد کرد.

پاسخ شماره ۳

if( char.toUpperCase() != char.toLowerCase() ) 

فقط در صورت حرف درست برمیگرداند

همانطور که در نظر زیر اشاره شده است، اگر شخصیت شما غیر انگلیسی، دارای ASCII بالا یا در محدوده دو بایت باشد، باید بررسی نقطه کد را اضافه کنید.

if( char.toUpperCase() != char.toLowerCase() || char.codePointAt(0) > 127 )

پاسخ شماره ۴

ES6 از عبارتهای منظم آگاه به یونیکد پشتیبانی میکند.

RegExp(/^\p{L}/,'u').test(str)

این برای همه الفباها کار میکند.

متأسفانه، یک باگ در فایرفاکس وجود دارد (در نسخه 78 برطرف خواهد شد) که مانع از استفاده جهانی از این مورد میشود. اما اگر بتوانید محیط اجرای خود را کنترل کنید و از آن پشتیبانی کند (مثلاً Node.js)، این یک راهحل مستقیم و جامع است.

به طور جایگزین، XRegExp یک پلیفیل از عبارات منظم مدرن را برای همه مرورگرها فراهم میکند.

پاسخ شماره ۵

من معتقدم این پلاگین تواناییهایی که شما جستجو میکنید را دارد: http://xregexp.com/plugins/ (لینک گیتهاب: https://github.com/slevithan/xregexp)

با آن میتوانید به سادگی تمام حروف یونیکد را با \p{L} مطابقت دهید.

سرصفحه این فایل منبع را بخوانید تا ببینید از کدام دستهها پشتیبانی میکند: http://xregexp.com/plugins/xregexp-unicode-categories.js

پاسخ شماره ۶

چطور درباره استفاده از کدهای ASCII؟

let n = str.charCodeAt(0);
let strStartsWithALetter = (n >= 65 && n < 91) || (n >= 97 && n < 123);