جاوااسکریپت - میخواهم علامتهای نقل قول دوتایی را از یک رشته حذف کنم


میخواهم "" اطراف یک رشته را حذف کنم.

به عنوان مثال، اگر رشته این باشد: "I am here"، سپس من تنها میخواهم I am here را نمایش دهم.

پاسخ شماره ۱

با فرض اینکه:

var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));

این باید جواب بده... (اگر هدفتان جایگزینی تمام علامتهای نقل قول است).

اینگونه عمل میکند:

  • ['"] یک کلاس کاراکتر است و هم کوتیشن تکی و هم کوتیشن دوتایی را مطابقت میدهد. شما میتوانید این را با " جایگزین کنید تا فقط کوتیشن دوتایی را مطابقت دهد.
  • +: یک یا چند نقل قول، کاراکتر، همانطور که توسط کلاس کاراکتر قبلی تعریف شده است (اختیاری)
  • g: پرچم سراسری. این به JS میگوید که regex را روی کل رشته اعمال کند. اگر این را حذف کنید، فقط یک کاراکتر جایگزین خواهد شد.

اگر شما سعی دارید علامتهای نقلقول اطراف یک رشته مشخص را حذف کنید (یعنی به صورت جفت)، اوضاع کمی پیچیدهتر میشود. شما باید از Assertions نگاهکردنی استفاده کنید:

var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove foo delimiting quotes
str = 'remove only "foo" delimiting "';//note trailing " at the end
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove only foo delimiting "<-- trailing double quote is not removed

توضیح ریجکس:

  • ": به صورت لفظی، با هر " لفظی مطابقت دارد
  • (: شروع گروهبندی ضبط. هر چیزی که بین پرانتزها (()) باشد ضبط میشود و میتواند در مقدار جایگزین استفاده شود.
  • [^"]+: کلاس کاراکتر، همهٔ کاراکترها را به جز " یک یا چند بار مطابقت میدهد
  • (?="): بررسی مثبت بدون عرض (به این معنا که ذخیره نمیشود). مطابقت قبلی تنها در صورتی معتبر خواهد بود که پس از آن یک نماد " واقعی بیاید
  • ): پایان گروهگیری، ما همه چیز بین شروع و پایان " را گرفتهایم
  • ": یک حرف دیگر به معنای واقعی، رجوع کنید به مورد شماره یک لیست

جایگزین '$1' است، این یک ارجاع بازگشتی به اولین گروه گرفته شده است که [^" ]+ است، یا همه چیز بین علامتهای نقل قول دوگانه. الگو هم علامتهای نقل قول و هم چیزهای بین آنها را مطابقت میدهد، اما فقط آنچه بین نقل قولهاست را جایگزین میکند، بنابراین عملاً آنها را حذف میکند.
کاری که انجام میدهد این است: some "string with" quotes -> جایگزین "string with" با -> string with میشود. نقل قولها حذف شدند، کار انجام شد.

اگر نقلقولها همیشه در ابتدای و انتهای رشته قرار داشته باشند، پس میتوانید از این استفاده کنید:

str.replace(/^"(.+(?="$))"$/, '$1');

یا این برای نقلقولهای دوگانه و تکگانه:

str.replace(/^["'](.+(?=["']$))["']$/, '$1');

با ورودی remove "foo" delimiting "، خروجی بدون تغییر خواهد ماند، اما رشته ورودی را به "remove "foo" delimiting quotes" تغییر دهید، و در نهایت خروجی به صورت remove "foo" delimiting quotes خواهد بود.

توضیح:

  • ^": با شروع رشته ^ و یک " مطابقت دارد. اگر رشته با یک " شروع نشود، عبارت از همین جا شکست میخورد و هیچ چیزی جایگزین نمیشود.
  • (.+(?="$)): همه چیز را مطابقت داده (و ضبط) میکند، شامل نقل قولهای دوبل یک یا چند بار، به شرطی که پیشبینی مثبت درست باشد
  • (?="$): نگاه به جلوی مثبت تقریباً همانند مثال بالا است، تنها اینکه مشخص میکند که " باید پایان رشته باشد ($ === پایان)
  • "$: با آن علامت نقل قول پایانی مطابقت دارد، اما آن را ضبط نمیکند

جایگزینی همانطور که قبلاً انجام میشد، انجام میشود: ما متن مطابقت داده شده (که شامل علامتهای نقل قول باز و بسته است) را با همه چیزهایی که در داخل آنها بود، جایگزین میکنیم.
ممکن است متوجه شده باشید که من پرچم g (برای حالت سراسری) را حذف کردهام، زیرا از آنجا که در حال پردازش کل رشته هستیم، این عبارت تنها یک بار اعمال میشود.
یک عبارت باقاعده سادهتر که تقریباً همان کار را انجام میدهد (تفاوتهای داخلی در نحوه کامپایل/اعمال عبارت باقاعده وجود دارد) ممکن است این باشد:

someStr.replace(/^"(.+)"$/,'$1');

همانند قبل، ^" و "$ با علامتهای نقل قول محدودهای در ابتدا و انتهای یک رشته مطابقت دارند، و (.+) با همه چیز بین آنها مطابقت دارد و آن را ضبط میکند. من این عبارت منظم را امتحان کردم، همراه با مورد بالا (با شرط نگاه به جلو) و، صادقانه بگویم، به تعجبم، متوجه شدم این یکی کمی کندتر است. حدس من این است که شرط نگاه به اطراف باعث میشود عبارت قبلی به محض اینکه موتور تشخیص دهد که در انتهای رشته " وجود ندارد، شکست بخورد. خب، اما اگر این چیزی است که میخواهید/نیاز دارید، لطفاً به خواندن ادامه دهید:

با این حال، در این آخرین مورد، انجام این کار بسیار ایمنتر، سریعتر، قابل نگهداریتر و به طور کلی بهتر است:

if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
    console.log(str.substr(1,str.length -2));
}

اینجا دارم بررسی میکنم که آیا اولین و آخرین کاراکتر در رشته، کوتیشن دوتایی هستند یا نه. اگر اینطور باشند، از substr استفاده میکنم تا آن اولین و آخرین کاراکتر را ببرم. رشتهها صفر-شاخصی هستند، بنابراین آخرین کاراکتر charAt(str.length -1) است. substr دو آرگومان میخواهد، که اولی مقدار جابهجایی از نقطه شروع زیررشته است و دومی طول آن است. چون نمیخواهیم آخرین کاراکتر، بیشتر از اولین را داشته باشیم، طول آن میشود str.length - 2. خیلی ساده.

نکات:

اطلاعات بیشتری دربارهٔ بررسیهای نگاهبهاطراف را میتوان اینجا پیدا کرد
عبارات منظم بسیار مفید هستند (و از نظر من سرگرمکننده)، اما در ابتدا ممکن است کمی گیجکننده باشند. در اینجا جزئیات بیشتری و پیوندهایی به منابع در این زمینه آورده شده است.
اگر هنوز در استفاده از عبارات منظم کاملاً راحت نیستید، ممکن است بخواهید استفاده از موارد زیر را مدنظر قرار دهید:

var noQuotes = someStr.split('"').join('');

اگر در رشته نقلقولهای زیادی وجود داشته باشد، این ممکن است حتی سریعتر از استفاده از عبارت منظم باشد

پاسخ شماره ۲

str = str.replace(/^"(.*)"$/, '$1');

این عبارت منظم تنها در صورتی که نقلقولها اولین و آخرین کاراکترهای رشته باشند، آنها را حذف خواهد کرد. به عنوان مثال:

"I am here"  => I am here (replaced)
I "am" here  => I "am" here (untouched)
I am here"   => I am here" (untouched)

پاسخ شماره ۳

اگر رشته تضمین شده باشد که یک علامت نقل قول (یا هر کاراکتر تک دیگری) در ابتدا و انتها داشته باشد و شما بخواهید آن را حذف کنید:

str = str.slice(1, -1);

slice نسبت به یک عبارت منظم سربار بسیار کمتری دارد.

پاسخ شماره ۴

اگر شما کنترل دادههای خود را دارید و میدانید که علامتهای نقل قول دوبل شما رشته را احاطه کردهاند (بنابراین در داخل رشته ظاهر نمیشوند) و رشته یک عدد صحیح است ... مثلا با :

"20151212211647278"

یا مشابه این، این بهخوبی علامتهای نقلقول اطراف را حذف میکند

JSON.parse("20151212211647278");

هرچند برای نیازهای خاص مناسب به نظر میرسد، پاسخ جامعی نیست

پاسخ شماره ۵

اگر فقط میخواهید نقل قولهای مرزی را حذف کنید:

function stripquotes(a) {
    if (a.charAt(0) === '"' && a.charAt(a.length-1) === '"') {
        return a.substr(1, a.length-2);
    }
    return a;
}

این روش به رشته دست نمیزند اگر شبیه "متن در داخل نقلقول" نباشد.

پاسخ شماره ۶

یک خط برای آدمهای تنبل

var str = '"a string"';
str = str.replace(/^"|"$/g, '');

پاسخ شماره ۷

اگر فقط میخواهید نقلقولها را از ابتدا یا انتها حذف کنید، از عبارت منظم زیر استفاده کنید:

'"Hello"'.replace(/(^"|"$)/g, '');