কীভাবে একাধিক লাইনের উপরে জাভাস্ক্রিপ্ট রেজেক্স ব্যবহার করবেন?


275
var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre.*?<\/pre>/gm );
alert(arr);     // null

আমি চাই চাই পিআরই ব্লকটি তুলে নেওয়া হোক, যদিও এটি নতুন লাইনের অক্ষরগুলিতে ছড়িয়ে রয়েছে। আমি ভেবেছিলাম 'মি' পতাকাটি এটি করে। না.

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

সুতরাং সমাধানটি হ'ল:

var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre[\s\S]*?<\/pre>/gm );
alert(arr);     // <pre>...</pre> :)

কারও কি কম রহস্যজনক উপায় আছে?

সম্পাদনা: এই সদৃশ কিন্তু যেহেতু এটা আমার চেয়ে এটি কঠিন, আমি সরাই না।

এটি [^]একটি "মাল্টলাইন ডট" হিসাবে প্রস্তাব করেছে । আমি এখনও যা বুঝতে পারি না তা কেন [.\n]কাজ করে না। অনুমান করুন এটি জাভাস্ক্রিপ্টের অন্যতম করুণ অংশ ..


29
একটি কম ক্রিপ্টিক রেজেক্স? অসম্ভব, প্রকৃতির দ্বারা।
রুবেন্স ফারিয়াস

বিটিডব্লিউ, আপনার পড়তে হবে: "পার্সিং এইচটিএমএল: দ্য চথুলহু
রুবেন ফারিয়াস

1
লিংক পূর্ববর্তী মন্তব্যটি থেকে পরিবর্তিত হয়েছে: blog.codinghorror.com/parsing-html-the-cthulhu-way (5yrs পর পরবর্তী)
তুখোড়

উত্তর:


248

[.\n].অভ্যন্তরের কোনও বিশেষ অর্থ নেই বলে কাজ করে না [], এর অর্থ কেবল আক্ষরিক .(.|\n)"নতুন লাইন সহ যে কোনও অক্ষর" নির্দিষ্ট করার উপায়। আপনি সব নতুন লাইন মেলে চান, আপনি যোগ করতে হবে \rপাশাপাশি উইন্ডোজ এবং সর্বোত্তম ম্যাক OS শৈলী লাইন শেষা w শ অন্তর্ভুক্ত করা: (.|[\r\n])

এটি কিছুটা জটিল, পাশাপাশি ধীর হয়ে উঠেছে ( বিশদগুলির জন্য ক্রিসওয়েডদেবের উত্তর দেখুন ), তাই আরও একটি সাদা পদ্ধতির অক্ষর এবং সমস্ত সাদা স্থানের অক্ষরগুলির সাথে মিলিয়ে নেওয়া আরও ভাল উপায় হবে approach[\s\S] , যা সমস্ত কিছুর সাথে মিলবে, এবং দ্রুত এবং সহজ।

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

পরিবর্তে, আপনার প্রয়োজনীয় ট্যাগটির জন্য ডিওএম অনুসন্ধান করার চেষ্টা করুন (jQuery ব্যবহার করা এটি সহজ করে তোলে তবে আপনি সর্বদা document.getElementsByTagName("pre")স্ট্যান্ডার্ড ডিওএম দিয়েই করতে পারেন ), এবং তারপরে আপনার যদি সামগ্রীগুলির সাথে মেলে প্রয়োজন হয় তবে রেজাল্টের সাথে সেই ফলাফলগুলির পাঠ্য সামগ্রীটি অনুসন্ধান করুন ।


আমি যা করছি তা হ'ল জাভাস্ক্রিপ্ট ব্যবহার করে উড়ে উড়ে উইকি -> এইচটিএমএল রূপান্তর করা। অতএব, আমার কাছে এখনও ডিওএম উপলব্ধ নেই। উইকি ফাইলটি বেশিরভাগ নিজস্ব সিনট্যাক্স হয়, তবে আমি প্রয়োজন হলে HTML ট্যাগ ব্যবহার করার অনুমতি দিই। আপনার পরামর্শটি খুব বৈধ, যদি আমি এটির সাথে ডওমে কাজ করতাম। ধন্যবাদ। :)
akauppi

যথেষ্ট ফর্সা। আমি মনে করি এটি এইচটিএমএলে রেজিেক্সগুলি ব্যবহার করার একটি বৈধ কারণ, যদিও এইচটিএমএল এর সাথে মিশ্রিত উইকি সিনট্যাক্সগুলি সব ধরণের মজাদার কর্নারের ক্ষেত্রে থাকতে পারে।
ব্রায়ান ক্যাম্পবেল

2
[\r\n]একটি সিকোয়েন্সে প্রয়োগ করা হয়েছে \ r \ n, প্রথমে মিলবে \ r এবং তারপরে \ n। Sequ r \ n বা ঠিক \ n কিনা তা নির্বিশেষে আপনি যদি একবারে পুরো ক্রমটি মেলাতে চান তবে এই প্যাটার্নটিটি ব্যবহার করুন.|\r?\n
এরিক বার্কল্যান্ড

1
একটি সম্পূর্ণ মাল্টলাইন স্ট্রিং মেলে , লোভী চেষ্টা করুন [\s\S]+
বোয়াজ

আমি শুধু বংশধরগণ জন্য যোগ করার জন্য যে জাতীয় Regex সিনট্যাক্স অর্থ উপেক্ষা চান .ভিতরে []হয় বিভিন্ন অন্যান্য Regex অবকাঠামো, বিশেষ করে .NET উন্নত একটির। লোকেরা, দয়া করে ধরে নিবেন না যে রেজেক্সসগুলি ক্রস প্ল্যাটফর্ম, তারা প্রায়শই হয় না !!
মিঃ টিএ

330

মাল্টলাইন মিলের (.|[\r\n])পরিবর্তে ব্যবহার করবেন না .

মাল্টলাইন মিলের [\s\S]পরিবর্তে ডিও ব্যবহার করুন.

এছাড়াও, এড়ানোর লালসা ব্যবহার করে প্রয়োজন না যেখানে *?বা +?পরিবর্তে কোয়ান্টিফায়ার *বা +। এটি একটি বিশাল কর্মক্ষমতা প্রভাব ফেলতে পারে।

: বেঞ্চমার্ক আমিই তোমাদের তৈরী করেছি দেখুন http://jsperf.com/javascript-multiline-regexp-workarounds

Using [^]: fastest
Using [\s\S]: 0.83% slower
Using (.|\r|\n): 96% slower
Using (.|[\r\n]): 96% slower

নোট: আপনি এটি ব্যবহার করতে পারেন [^]তবে এটি নীচের মন্তব্যে অবহেলা করা হয়েছে।


22
ভাল পয়েন্ট, তবে আমি [^]যাই হোক না কেন ব্যবহারের বিরুদ্ধে প্রস্তাব দিই । একদিকে, জাভাস্ক্রিপ্ট হ'ল আমি জানি যে এটি সেই আইডিয়মকে সমর্থন করে এবং এমনকি সেখানে প্রায়শই প্রায় ব্যবহৃত হয় না [\s\S]। অন্যদিকে, বেশিরভাগ অন্যান্য স্বাদগুলি ]এটিকে প্রথমে তালিকাবদ্ধ করে পালাতে দেয় । অন্য কথায়, জাভাস্ক্রিপ্ট মধ্যে [^][^]কোন দুটি অক্ষরের সাথে মেলে, কিন্তু .NET এটা কোনো মিল এক চেয়ে চরিত্র অন্যান্য ], [অথবা ^
অ্যালান মুর

1
আপনি কীভাবে জানেন যে \Sএটি মিলবে \rবা \nঅন্য কোনও চরিত্রের বিপরীতে?
গিলি

3
Question s \ এস বিবরণের জন্য এই প্রশ্নটি দেখুন । এটি সমস্ত সাদা-স্থানের অক্ষর + সমস্ত অ-শ্বেতস্থান অক্ষর = সমস্ত অক্ষরের সাথে মিলানোর জন্য একটি হ্যাক। আরও দেখুন MDN regexp বিশেষ অক্ষর নথিপত্রের জন্য।
KrisWebDev

4
[\s\S]অন্যের চেয়ে পছন্দ করার কোনও কারণ , পছন্দ [\d\D]বা [\w\W]?
ফ্রেগজ

1
আমাকে তাড়াতাড়ি উল্লেখ করতে দাও যে লোভী অপারেটরের জন্য আপনার পরীক্ষাটি কারচুপি করা হয়েছে। /<p>Can[^]*?<\/p>/এর মতো একই সামগ্রীর সাথে মেলে না /<p>Can[^]*<\/p>/। লোভী রূপটি /<p>(?:[^<]|<(?!\/p>))*<\/p>/একই সামগ্রীর সাথে মেলে পরিবর্তন করা উচিত ।
3limin4t0r

19

আপনি আপনার পরিবেশ এবং জাভাস্ক্রিপ্ট (ECMAscript) এর সংস্করণ উল্লেখ করবেন না এবং আমি বুঝতে পারি যে এই পোস্টটি ২০০৯ সালের ছিল, তবে কেবল সম্পূর্ণতার জন্য, ECMA2018 প্রকাশের সাথে সাথে আমরা এখন sপতাকাটি .'' n 'এর সাথে ম্যাচ করার জন্য ব্যবহার করতে পারি , https দেখুন see : //stackoverflow.com/a/36006948/141801

এভাবে:

let s = 'I am a string\nover several\nlines.';
console.log('String: "' + s + '".');

let r = /string.*several.*lines/s; // Note 's' modifier
console.log('Match? ' + r.test(s); // 'test' returns true

এটি সাম্প্রতিক সংযোজন এবং বর্তমানের বেশিরভাগ পরিবেশে কাজ করবে না, উদাহরণস্বরূপ নোড ভি ৮. recognize.০ এটি সনাক্ত করে না বলে মনে হচ্ছে, তবে এটি ক্রোমিয়ামে কাজ করে, এবং আমি এটি টাইপস্ক্রিপ্ট পরীক্ষায় ব্যবহার করছি যা আমি লিখছি এবং সম্ভবত এটি লিখছি সময়ের সাথে সাথে আরও মূলধারায় পরিণত হবে।


1
এটি ক্রোমে দুর্দান্ত কাজ করে (ভি 67) তবে আইই 11 এবং আইইজেজে (ভি 42) -তে রেইগেক্সটি সম্পূর্ণভাবে ভেঙে যায় (লাইন বাই লাইন কাজ করাও বন্ধ করে দেয়)
স্বাধীনতা-

ধন্যবাদ @ স্বাধীনতা-এম .. IE একটি খুব নতুন বৈশিষ্ট্য সমর্থন না করা প্রায় সম্পূর্ণ উদ্বেগজনক :) তবে হ্যাঁ, এটি উল্লেখ করার মতো বিষয় যেখানে এটি 'ডিবাগ' করার চেষ্টা করে এমন কাউকে বাঁচাতে কেন এটি কাজ করে না কেন তাদের ব্যবহারের প্রচেষ্টা কাজ করছে না? প্রত্যাশিত.
নিক

11

[.\n]কাজ করে না, কারণ ডট ইন [](কেবলমাত্র জাভাস্ক্রিপ্ট নয়) ডট-চরিত্রের অর্থ d পরিবর্তে আপনি (.|\n)(বা (.|[\n\r])) ব্যবহার করতে পারেন ।


24
[\s\S]নিউলাইনগুলি সহ সমস্ত কিছু মেলাতে জাভাস্ক্রিপ্টের সবচেয়ে সাধারণ প্রতিমা। এটা অনেক আরো দক্ষ চোখ সহজ এবং মতো আবর্তনে ভিত্তিক পদ্ধতির চেয়ে এর (.|\n)। (এটা আক্ষরিক কোন চরিত্র মানে " হয় হোয়াইটস্পেস বা কোনো চরিত্র নয় । হোয়াইটস্পেস)
অ্যালেন মুর

2
ঠিক বলেছ, কিন্তু প্রশ্ন সম্পর্কে ছিল .এবং \nএবং কেন [.\n]কাজ করে না। প্রশ্নে উল্লিখিত হিসাবে, [^]এটিও দুর্দান্ত পদ্ধতির।
ওয়াই শোহম

6

আমি এটি (ক্রোম) পরীক্ষা করেছি এবং এটি আমার জন্য (উভয় [^]এবং উভয়ই [^\0]) কাজ করে, বিন্দু ( .) উভয় দ্বারা পরিবর্তন করে [^\0]বা [^], কারণ বিন্দু লাইন বিরতির সাথে মেলে না (এখানে দেখুন:http://www.regular-expressions.info/dot.html )।

var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre[^\0]*?<\/pre>/gm );
alert(arr);     //Working


1
সমস্যাটি [^\0]হ'ল এটি নাল অক্ষরের সাথে মেলে না যদিও জাভাস্ক্রিপ্ট স্ট্রিংগুলিতে নাল অক্ষর অনুমোদিত ( এই উত্তরটি দেখুন )।
ডোনাল্ড হাঁস

0

উপরে বর্ণিত উদাহরণগুলি ছাড়াও এটি একটি বিকল্প।

^[\\w\\s]*$

\wশব্দের জন্য যেখানে এবং \sসাদা স্পেসের জন্য

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