জাভাস্ক্রিপ্ট রেজেক্স মাল্টলাইন পতাকা কাজ করে না


265

আমি এইচটিএমএল থেকে স্ট্রিং আনার জন্য একটি রেজেক্স লিখেছি, তবে মনে হচ্ছে মাল্টলাইন পতাকাটি কাজ করে না।

এটি আমার নিদর্শন এবং আমি h1ট্যাগটিতে পাঠ্য পেতে চাই ।

var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];

আমি এটি পরীক্ষা করার জন্য একটি স্ট্রিং তৈরি করেছি। যখন স্ট্রিংটিতে "\ n" থাকে, ফলাফল সর্বদা নাল হয়। আমি যদি সমস্ত "\ n" গুলি সরিয়ে ফেলেছি তবে এটি আমাকে সঠিক ফলাফল দিয়েছে, /mপতাকাটির সাথে বা এটি ছাড়া কোনও ব্যাপার নয় ।

আমার রেইগেক্সে কি সমস্যা?


14
এইচটিএমএল পার্স করার জন্য নিয়মিত এক্সপ্রেশন ব্যবহার করবেন না, এইচটিএমএল কোনও নিয়মিত ভাষা নয়। এইচটিএমএল পার্সার, রেস ব্যবহার করুন। ডোম এটিও অনেক সহজ।
সোভান্তে

আপনি ডটল খুঁজছেন, বহু লাইন নয়।
ভানুয়ান 21

লক্ষ্য করুন জাভাস্ক্রিপ্ট শীঘ্রই থাকবেdotAll আপনি কি করতে পারেন, যাতে পরিবর্তক /.../sএবং আপনার বিন্দু এছাড়াও নতুন লাইন ম্যাচ হবে। জুলাই 2017 পর্যন্ত এটি ক্রোমের একটি পতাকার পিছনে।

উত্তর:


609

আপনি সংশোধকটির সন্ধান করছেন,/.../s যা ডটল সংশোধক হিসাবেও পরিচিত । এটি বিন্দুটিকে .নতুন লাইনের সাথে মেলে তুলতে বাধ্য করে, যা এটি ডিফল্টরূপে করে না

খারাপ খবরটি এটি জাভাস্ক্রিপ্টে নেই (এটি ES2018 হিসাবে রয়েছে, নীচে দেখুন) । সুসংবাদটি হ'ল আপনি একটি চরিত্র শ্রেণি (উদাহরণস্বরূপ \s) এবং এর অবহেলা ( \S) একসাথে ব্যবহার করে এটির চারপাশে কাজ করতে পারেন :

[\s\S]

সুতরাং আপনার ক্ষেত্রে রেজেক্স হয়ে উঠবে:

/<div class="box-content-5">[\s\S]*<h1>([^<]+?)<\/h1>/i

ES2018 এর হিসাবে, জাভাস্ক্রিপ্ট সমর্থন sএকটি আধুনিক পরিবেশ হিসাবে আপনি এটা লিখেছে আপনার রেগুলার এক্সপ্রেশন হতে পারে যাতে, (dotAll) পতাকা, কিন্তু একটি সঙ্গে sশেষে পতাকা (বদলে m; mপরিবর্তনগুলি কিভাবে ^এবং $কাজ, না .):

/<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/is

5
@ সিমো কার্যকরভাবে যে কোনও চরিত্রের সাথে মেলে এমন কোনও শ্বেতস্পেস বা নন হোয়াইটস্পেসের সাথে মেলে। এটির মতো ., তবে হোয়াইটস্পেসের সাথে খুব \sমিল ( ) এর অর্থ এটিও মেলে \n(যা .জাভাস্ক্রিপ্টে হয় না, বা sপতাকাটি দিয়ে তৈরি করা যেতে পারে )।
অ্যালেক্স

1
এই উত্তরটি "মোডিফায়ার্স" এর অধীনে স্ট্যাক ওভারফ্লো নিয়মিত এক্সপ্রেশন FAQ এ যুক্ত করা হয়েছে ।
aliteralmind

40
এমডিএন অনুসারে [^], জাভাস্ক্রিপ্টে নিউলাইনগুলি সহ যে কোনও চরিত্রের সাথে মেলে কাজ করে। বিকাশকারী.মোজিলা.অর্গ.ওয়েেন
ড্যান অ্যালেন

6
কর্মক্ষমতা সম্পর্কিত সমস্যার জন্য, লোভ এড়াতে *?পরিবর্তে কোয়ান্টিফায়ার ব্যবহার *করার পরামর্শ দেওয়া হয়। এটি নথির শেষ <h1> ধরা এড়াতে পারে : সম্ভবত আপনি যা চান তা সম্ভবত নয় এবং এটি দক্ষ নয় কারণ রেজিএক্সপ্রেস স্ট্রিংয়ের সমাপ্তি অবধি <h1> সন্ধান করতে থাকবে যদিও এটি ইতিমধ্যে এটি খুঁজে পেয়েছে।
ক্রিসওয়েবদেভ

9
[^] সংস্করণটি রেজিএক্সপেক্স সংকলকটিতে সহজতর, এবং আরও ক্ষুদ্র।
এরিক ক্যারি

21

আপনি s(ডটাল) সংশোধক চান যা জাভাস্ক্রিপ্টে দৃশ্যত বিদ্যমান নেই - আপনি .@ মল্ফের পরামর্শ অনুসারে [\ s \ S] দ্বারা প্রতিস্থাপন করতে পারেন । m(একাধিক লাইন) পরিবর্তক তোলে ^ এবং $ ম্যাচ লাইন বদলে পুরো স্ট্রিং।


4
আপনি যোগ হতে পারে / সেকেন্ড "পরিবর্তক সেট singleline মোডে একাধিক লাইন মোড বিরোধিতা +1 টি।
Cerebrus

নয় বছর পরে, জাভাস্ক্রিপ্টে এখন sপতাকা রয়েছে (ES2018)। :-)
টিজে ক্রোডার

12

[\s\S]নোডেজে for.১১.৩ এ আমার জন্য কাজ করেনি। রেজিএক্সপ ডকুমেন্টেশনের ভিত্তিতে , এটি আমার পক্ষে [^]কাজ করে এমনটি ব্যবহার করতে বলে ।

(বিন্দু, দশমিক পয়েন্ট) লাইন টার্মিনেটর ব্যতীত যে কোনও একক অক্ষরের সাথে মেলে: \ n, \ r, \ u2028 বা 20 u2029।

একটি অক্ষর সেট ভিতরে, বিন্দু তার বিশেষ অর্থ হারিয়ে এবং একটি আক্ষরিক বিন্দু মেলে।

নোট করুন যে মি মাল্টলাইন পতাকাটি বিন্দুর আচরণ পরিবর্তন করে না। সুতরাং একাধিক লাইন জুড়ে একটি প্যাটার্ন মেলানোর জন্য, অক্ষর সেট [^] ব্যবহার করা যেতে পারে (যদি আপনি IE এর কোনও পুরানো সংস্করণ বোঝায় না) তবে এটি নিউলাইনগুলি সহ যে কোনও চরিত্রের সাথে মিলবে।

উদাহরণ স্বরূপ:

/This is on line 1[^]*?This is on line 3/m

* কোথায়? [^] এর 0 বা ততোধিক ঘটনার অ লোভী দখল।


1
যারা ভাবছি কি জন্য [^]এটি একটি ডবল অস্বীকৃতি মত হল: মানে "কোনো চরিত্র যে মেলে না এই খালি তালিকা" এবং তাই এটি বলার অপেক্ষা রাখে না আসে নিচে "কোনো চরিত্র মেলে"
ট্রাইঙ্কট

8

Dotall পরিবর্তক আসলে জাভাস্ক্রিপ্ট মধ্যে জুন 2018 সালে, যে নাম ECMAScript 2018 হয় করেছে
https://github.com/tc39/proposal-regexp-dotall-flag

const re = /foo.bar/s; // Or, `const re = new RegExp('foo.bar', 's');`.
re.test('foo\nbar');
// → true
re.dotAll
// → true
re.flags
// → 's'

0

আমার পরামর্শ হ'ল "\ n" এর সাথে একাধিক-লাইনের স্ট্রিংটি বিভক্ত করা ভাল এবং মূল স্ট্রিংয়ের স্প্লিটগুলি একত্রিত করা ভাল এবং একক লাইন হয়ে ওঠার জন্য সহজ হয়ে ওঠে।

<textarea class="form-control" name="Body" rows="12" data-rule="required" 
                  title='@("Your feedback ".Label())'
                  placeholder='@("Your Feedback here!".Label())' data-val-required='@("Feedback is required".Label())'
                  pattern="^[0-9a-zA-Z ,;/?.\s_-]{3,600}$" data-val="true" required></textarea>


$( document ).ready( function() {
  var errorMessage = "Please match the requested format.";
  var firstVisit = false;

  $( this ).find( "textarea" ).on( "input change propertychange", function() {

    var pattern = $(this).attr( "pattern" );
    var element = $( this );

    if(typeof pattern !== typeof undefined && pattern !== false)
    {
      var ptr = pattern.replace(/^\^|\$$/g, '');
      var patternRegex = new RegExp('^' + pattern.replace(/^\^|\$$/g, '') + '$', 'gm');     

      var ks = "";
      $.each($( this ).val().split("\n"), function( index, value ){
        console.log(index + "-" + value);
        ks += " " + value;
      });      
      //console.log(ks);

      hasError = !ks.match( patternRegex );
      //debugger;

      if ( typeof this.setCustomValidity === "function") 
      {
        this.setCustomValidity( hasError ? errorMessage : "" );
      } 
      else 
      {
        $( this ).toggleClass( "invalid", !!hasError );
        $( this ).toggleClass( "valid", !hasError );

        if ( hasError ) 
        {
          $( this ).attr( "title", errorMessage );
        } 
        else
        {
          $( this ).removeAttr( "title" );
        }
      }
    }

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