জাভা স্ক্রিপ্টের স্ট্রিং.ইন্ডেক্সঅফ () এর এমন কোনও সংস্করণ রয়েছে যা নিয়মিত প্রকাশের জন্য অনুমতি দেয়?


214

জাভাস্ক্রিপ্টে, স্ট্রিং.ইন্ডেক্সঅফ () এর সমতুল্য কি এখনও দ্বিতীয় প্যারামিটারের অনুমতি দেওয়ার পরে প্রথম প্যারামিটারের স্ট্রিংয়ের পরিবর্তে নিয়মিত ভাব প্রকাশ হয়?

আমার মতো কিছু করা দরকার

str.indexOf(/[abc]/ , i);

এবং

str.lastIndexOf(/[abc]/ , i);

স্ট্রিং.সার্চ () প্যারামিটার হিসাবে একটি রেজিপ্স্ট নেওয়ার সময় এটি আমাকে দ্বিতীয় যুক্তি নির্দিষ্ট করার অনুমতি দেয় না!

সম্পাদনা:
এটি প্রাথমিকভাবে আমার যা ভাবা হয়েছিল তার চেয়ে শক্ত হয়ে গেছে তাই আমি সরবরাহিত সমস্ত সমাধান পরীক্ষা করার জন্য একটি ছোট পরীক্ষা ফাংশন লিখেছিলাম ... এটি ধরে নিয়েছে স্ট্রিং অবজেক্টে regexIndexOf এবং regexLastIndexOf যোগ করা হয়েছে।

function test (str) {
    var i = str.length +2;
    while (i--) {
        if (str.indexOf('a',i) != str.regexIndexOf(/a/,i)) 
            alert (['failed regexIndexOf ' , str,i , str.indexOf('a',i) , str.regexIndexOf(/a/,i)]) ;
        if (str.lastIndexOf('a',i) != str.regexLastIndexOf(/a/,i) ) 
            alert (['failed regexLastIndexOf ' , str,i,str.lastIndexOf('a',i) , str.regexLastIndexOf(/a/,i)]) ;
    }
}

এবং আমি এটির জন্য নিখুঁতভাবে পরীক্ষা করে নিচ্ছি যে একটি চরিত্রের রেজিএক্সপক্সের জন্য, ফলাফলটি একই রকম হয় যেমন আমরা সূচিপত্র ব্যবহার করেছি

// এক্স
পরীক্ষার মধ্যে একটিটির জন্য অনুসন্ধান করুন ('xxx');
পরীক্ষা ( 'axx');
পরীক্ষা ( 'xax');
পরীক্ষা ( 'xxa');
পরীক্ষা ( 'AXA');
পরীক্ষা ( 'xaa');
পরীক্ষা ( 'aax');
পরীক্ষা ( 'AAA');


|অভ্যন্তর [ ]আক্ষরিক চরিত্রের সাথে মেলে |। আপনি সম্ভবত বোঝানো [abc]
মার্কাস জারদারোট

হ্যাঁ ধন্যবাদ আপনি ঠিক বলেছেন, আমি এটি ঠিক করে দেব তবে রেজিপেক্স নিজেই অপ্রাসঙ্গিক ...
প্যাট

আমার উত্তরটি আপডেট করেছে প্যাট, কোনও প্রতিক্রিয়ার জন্য ধন্যবাদ।
জেসন বুটিং

আমি খুঁজে পেয়েছি একটি সহজ এবং কার্যকর পন্থা কেবল স্ট্রিং.ম্যাচ (/ [এজেড] /) ব্যবহার করা। যদি কোন অনেক হয়, পদ্ধতি আয় নাল, অন্যথায় আপনি একটি বস্তু পেতে, তবে আপনি মিলটির (/ [জেড] /) কি করতে পারেন সূচক প্রথম বড় হাতের অক্ষর সূচক জন্য।
Syler

উত্তর:


129

ইতিমধ্যে উল্লিখিত কয়েকটি পদ্ধতির সংমিশ্রণ (ইনডেক্সফ স্পষ্টতই বরং সরল), আমি মনে করি এগুলি সেই কৌশলগুলি করবে যা:

String.prototype.regexIndexOf = function(regex, startpos) {
    var indexOf = this.substring(startpos || 0).search(regex);
    return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf;
}

String.prototype.regexLastIndexOf = function(regex, startpos) {
    regex = (regex.global) ? regex : new RegExp(regex.source, "g" + (regex.ignoreCase ? "i" : "") + (regex.multiLine ? "m" : ""));
    if(typeof (startpos) == "undefined") {
        startpos = this.length;
    } else if(startpos < 0) {
        startpos = 0;
    }
    var stringToWorkWith = this.substring(0, startpos + 1);
    var lastIndexOf = -1;
    var nextStop = 0;
    while((result = regex.exec(stringToWorkWith)) != null) {
        lastIndexOf = result.index;
        regex.lastIndex = ++nextStop;
    }
    return lastIndexOf;
}

স্পষ্টতই, বিল্ট-ইন স্ট্রিং অবজেক্টটি সংশোধন করা বেশিরভাগ মানুষের জন্য লাল পতাকা প্রেরণ করতে পারে তবে এটি এমন এক সময় হতে পারে যখন কোনও চুক্তি এত বড় না; এটি সম্পর্কে সচেতন হতে হবে।


আপডেট: সম্পাদিত regexLastIndexOf()যাতে lastIndexOf()এখন অনুকরণীয় মনে হয় । এটি এখনও ব্যর্থ হলে এবং কোন পরিস্থিতিতে আমাকে তা জানান।


আপডেট: এই পৃষ্ঠায় মন্তব্যগুলিতে পাওয়া সমস্ত পরীক্ষা এবং আমার নিজস্ব পাস করে। অবশ্যই, এর অর্থ এটি বুলেটপ্রুফ নয়। কোন প্রতিক্রিয়া প্রশংসা।


আপনার regexLastIndexOfকেবলমাত্র সর্বশেষ নন-ওভারল্যাপিং ম্যাচের সূচকটি ফিরে আসবে ।
মার্কাস জারদারোট

দুঃখিত, একটি বিশাল রেগেক্স ছেলে নয় - আপনি কি আমাকে এমন উদাহরণ দিতে পারেন যা আমারকে ব্যর্থ করে দেবে? আমি আরও শিখতে পেরে প্রশংসা করি, তবে আপনার প্রতিক্রিয়া কাউকে আমার মতো অজ্ঞ হিসাবে সহায়তা করে না। :)
জেসন বুটিং

জেসন আমি প্রশ্নটিতে পরীক্ষা করার জন্য কিছু ফাংশন যুক্ত করেছি। এটি ব্যর্থ হচ্ছে (অন্যান্য পরীক্ষার মধ্যে) নিম্নলিখিত 'axx'.lastIndexOf (' a ', 2)! =' axx'.regexLastIndexOf (/ a /, 2)
পট

2
আমি মনে করি এটি regex.lastIndex = result.index + 1;পরিবর্তে ব্যবহার করা আরও দক্ষ regex.lastIndex = ++nextStop;। এটি কোনও ফলাফল হারাতে না পারার আশায় পরের ম্যাচে আরও দ্রুত এগিয়ে যাবে।
Gedrox

1
আপনি যদি এনপিএম থেকে এটিকে টানতে পছন্দ করেন তবে এই দুটি ব্যবহারের ফাংশন এখন এনপিএম হিসাবে রয়েছে: npmjs.com/package/index-of-regex
ক্যাপাজ

185

Stringকনস্ট্রাক্টরের উদাহরণগুলির মধ্যে একটি .search()পদ্ধতি রয়েছে যা একটি রেজিপ্স্প গ্রহণ করে এবং প্রথম ম্যাচের সূচকটি প্রদান করে।

নির্দিষ্ট অবস্থান থেকে অনুসন্ধান শুরু করতে (এর দ্বিতীয় প্যারামিটার জালিয়াতি করে .indexOf()) আপনি sliceপ্রথম iঅক্ষরটি বন্ধ করতে পারেন :

str.slice(i).search(/re/)

তবে এটি সূচকটি সংক্ষিপ্ত স্ট্রিংয়ে পাবেন (প্রথম অংশটি কেটে দেওয়ার পরে) সুতরাং আপনি কাটা বন্ধ অংশের দৈর্ঘ্য ( i) না থাকলে ফেরত সূচকে যোগ করতে চাইবেন -1। এটি আপনাকে মূল স্ট্রিংয়ে সূচি দেবে:

function regexIndexOf(text, re, i) {
    var indexInSuffix = text.slice(i).search(re);
    return indexInSuffix < 0 ? indexInSuffix : indexInSuffix + i;
}

1
প্রশ্ন থেকে: স্ট্রিং.সার্চ () যখন প্যারামিটার হিসাবে একটি রেজিপ্সপ নেয় তখন এটি আমাকে দ্বিতীয় তর্কটি নির্দিষ্ট করার অনুমতি দেয় না!
প্যাট

14
str.substr (i)। অনুসন্ধান (/ পুনরায় /)
গ্লেন

6
দুর্দান্ত সমাধান, তবে আউটপুটটি কিছুটা আলাদা। সূচিপত্র শুরু থেকে একটি সংখ্যার ফিরবে (অফসেট নির্বিশেষে), তবে এটি অফসেট থেকে অবস্থানটি ফিরিয়ে দেবে। সুতরাং, সমতার জন্য, আপনি এর মতো আরও কিছু চাইবেন:function regexIndexOf(text, offset) { var initial = text.substr(offset).search(/re/); if(initial >= 0) { initial += offset; } return initial; }
gkoberger

39

আপনার জন্য আমার একটি সংক্ষিপ্ত সংস্করণ রয়েছে। এটি আমর জন্য ভাল কাজ করছে!

var match      = str.match(/[abc]/gi);
var firstIndex = str.indexOf(match[0]);
var lastIndex  = str.lastIndexOf(match[match.length-1]);

এবং আপনি যদি প্রোটোটাইপ সংস্করণ চান:

String.prototype.indexOfRegex = function(regex){
  var match = this.match(regex);
  return match ? this.indexOf(match[0]) : -1;
}

String.prototype.lastIndexOfRegex = function(regex){
  var match = this.match(regex);
  return match ? this.lastIndexOf(match[match.length-1]) : -1;
}

সম্পাদনা : আপনি থেকে ইনডেক্সের জন্য সমর্থন যুক্ত করতে চাইলে

String.prototype.indexOfRegex = function(regex, fromIndex){
  var str = fromIndex ? this.substring(fromIndex) : this;
  var match = str.match(regex);
  return match ? str.indexOf(match[0]) + fromIndex : -1;
}

String.prototype.lastIndexOfRegex = function(regex, fromIndex){
  var str = fromIndex ? this.substring(0, fromIndex) : this;
  var match = str.match(regex);
  return match ? str.lastIndexOf(match[match.length-1]) : -1;
}

এটি ব্যবহার করার জন্য, এটি যতটা সহজ:

var firstIndex = str.indexOfRegex(/[abc]/gi);
var lastIndex  = str.lastIndexOfRegex(/[abc]/gi);

এটি আসলে একটি দুর্দান্ত কৌশল। যদি আপনি এটি সম্প্রসারিত এছাড়াও নেওয়া মহান হতে হবে startIndexযথারীতি পরামিতি indeoxOfএবং lastIndexOfনা।
রবার্ট কোরিটনিক

@ রবার্টকরিটনিক - আমি সমর্থন করার জন্য আমার উত্তর সম্পাদনা করেছি startIndex(বা fromIndex)। আশা করি এটা সাহায্য করবে!
পিএমরোটুল

lastIndexOfRegexfromIndexফলাফলের মানটিও আবার যুক্ত করা উচিত ।
পিটার

আপনার অ্যালগরিদম নিম্নলিখিত দৃশ্যে ভেঙে যাবে: "aRomeo Romeo".indexOfRegex(new RegExp("\\bromeo", 'gi'));ফলাফলটি 1 হবে যখন এটি 7 হবে, কারণ ইনডেক্সঅফ প্রথমবার "রোমিও" প্রদর্শিত হবে এটি কোনও শব্দের শুরুতে আছে বা না তা বিচার্য নয়।
কোরেলকে

13

ব্যবহার করুন:

str.search(regex)

ডকুমেন্টেশন এখানে দেখুন।


11
@ ওজজি: না, সত্যই নয়। এটি মূলত গ্লেনের উত্তর (১৫০ ডলারের সমাহার সহ), এর কোনও ব্যাখ্যা নেই, ব্যতীত আর কোনও শুরুর অবস্থান সমর্থন করে না0 , এবং পোস্ট করা হয়েছিল ... সাত বছর পরে।
ccjmne

7

বেলিপি এর উত্তরের ভিত্তিতে। প্রধান পার্থক্য হ'ল এই -1প্যাটার্নগুলি ফিরে আসে যদি প্যাটার্নটি মেলানো না যায়।

সম্পাদনা: জেসন বুটিংয়ের উত্তরের জন্য আমি একটি ধারণা পেয়েছি। কেন .lastIndexরেজেক্সের সম্পত্তি সংশোধন করবেন না ? যদিও এটি কেবল বৈশ্বিক পতাকা ( /g) সহ নিদর্শনগুলির জন্য কাজ করবে ।

সম্পাদনা: পরীক্ষা-কেস পাস করার জন্য আপডেট।

String.prototype.regexIndexOf = function(re, startPos) {
    startPos = startPos || 0;

    if (!re.global) {
        var flags = "g" + (re.multiline?"m":"") + (re.ignoreCase?"i":"");
        re = new RegExp(re.source, flags);
    }

    re.lastIndex = startPos;
    var match = re.exec(this);

    if (match) return match.index;
    else return -1;
}

String.prototype.regexLastIndexOf = function(re, startPos) {
    startPos = startPos === undefined ? this.length : startPos;

    if (!re.global) {
        var flags = "g" + (re.multiline?"m":"") + (re.ignoreCase?"i":"");
        re = new RegExp(re.source, flags);
    }

    var lastSuccess = -1;
    for (var pos = 0; pos <= startPos; pos++) {
        re.lastIndex = pos;

        var match = re.exec(this);
        if (!match) break;

        pos = match.index;
        if (pos <= startPos) lastSuccess = pos;
    }

    return lastSuccess;
}

এটি এখন পর্যন্ত সবচেয়ে প্রতিশ্রুতিবদ্ধ বলে মনে হচ্ছে (কয়েকটি সিট্যাক্স ফিক্সের পরে) :-) কেবলমাত্র প্রান্ত শর্তে কয়েকটি পরীক্ষা ব্যর্থ। 'Axx'.lastIndexOf (' a ', 0)! =' Axx'.regexLastIndexOf (/ a /, 0) এর মতো বিষয়গুলি ... আমি এই বিষয়গুলি ঠিক করতে পারি কিনা তা দেখার জন্য আমি এটি খতিয়ে দেখছি
প্যাট

6

আপনি সাবস্ট্রাস্ট ব্যবহার করতে পারেন।

str.substr(i).match(/[abc]/);

ও'রিলি দ্বারা প্রকাশিত সুপরিচিত জাভাস্ক্রিপ্ট বইটি থেকে: "সাবস্ট্রাস্ট ECMAScript দ্বারা মানক করা যায় নি এবং তাই হ্রাস করা হয়েছে।" তবে আপনি যা পাচ্ছেন তার পিছনে আমি মূল ধারণাটি পছন্দ করি।
জেসন বুটিং

1
এটি একটি নন ইস্যু। আপনি যদি সত্যিই এটি সম্পর্কে উদ্বিগ্ন হন তবে পরিবর্তে স্ট্রিং.স্যাবস্ট্রিং () ব্যবহার করুন - আপনাকে গণিতটি কিছুটা আলাদাভাবে করতে হবে। এছাড়াও জাভাস্ক্রিপ্ট এর মূল ভাষা 100% হওয়া উচিত নয় to
পিটার বেইলি

এটি কোনও নন-ইস্যু নয় - যদি আপনি আপনার কোডটি এমন কোনও প্রয়োগের বিরুদ্ধে চালিয়ে যান যা সাবস্ট্রাস্টার প্রয়োগ করে না কারণ তারা ECMAScript মান মেনে চলতে চায় তবে আপনার সমস্যা হতে চলেছে। মঞ্জুর, সাবস্ট্রিংয়ের সাথে এটি প্রতিস্থাপন করা এতটা কঠিন নয়, তবে এটি সম্পর্কে সচেতন হওয়া ভাল।
জেসন বুটিং

1
এই মুহুর্তে আপনার সমস্যাগুলির খুব সহজ সমাধান রয়েছে। আমি মন্তব্যগুলি বোধগম্য মনে করি, তবে ডাউন ভোটটি ছিল পেডেন্টিক।
ভোরোনাইপোটাটো

একটি ওয়ার্কিং ডেমো কোড সরবরাহ করতে দয়া করে আপনার উত্তরটি সম্পাদনা করতে পারেন?
vsync

5

RexExpউদাহরণগুলির মধ্যে ইতিমধ্যে একটি সর্বশেষ তালিকা রয়েছে (যদি তারা বিশ্বব্যাপী হয়) এবং তাই আমি যা করছি তা নিয়মিত এক্সপ্রেশনটি অনুলিপি করা, এটি আমাদের উদ্দেশ্য অনুসারে সামান্য পরিবর্তন করা, execস্ট্রিং-এ স্ট্রিংয়ে থাকা এবং সন্ধান করা lastIndex। এটি অনিবার্যভাবে স্ট্রিংয়ের লুপিংয়ের চেয়ে দ্রুত হবে। (স্ট্রিং প্রোটোটাইপে কীভাবে এটি রাখবেন, আপনার যথেষ্ট উদাহরণ রয়েছে?)

function reIndexOf(reIn, str, startIndex) {
    var re = new RegExp(reIn.source, 'g' + (reIn.ignoreCase ? 'i' : '') + (reIn.multiLine ? 'm' : ''));
    re.lastIndex = startIndex || 0;
    var res = re.exec(str);
    if(!res) return -1;
    return re.lastIndex - res[0].length;
};

function reLastIndexOf(reIn, str, startIndex) {
    var src = /\$$/.test(reIn.source) && !/\\\$$/.test(reIn.source) ? reIn.source : reIn.source + '(?![\\S\\s]*' + reIn.source + ')';
    var re = new RegExp(src, 'g' + (reIn.ignoreCase ? 'i' : '') + (reIn.multiLine ? 'm' : ''));
    re.lastIndex = startIndex || 0;
    var res = re.exec(str);
    if(!res) return -1;
    return re.lastIndex - res[0].length;
};

reIndexOf(/[abc]/, "tommy can eat");  // Returns 6
reIndexOf(/[abc]/, "tommy can eat", 8);  // Returns 11
reLastIndexOf(/[abc]/, "tommy can eat"); // Returns 11

আপনি RegExp অবজেক্টে ফাংশনগুলি প্রোটোটাইপও করতে পারেন:

RegExp.prototype.indexOf = function(str, startIndex) {
    var re = new RegExp(this.source, 'g' + (this.ignoreCase ? 'i' : '') + (this.multiLine ? 'm' : ''));
    re.lastIndex = startIndex || 0;
    var res = re.exec(str);
    if(!res) return -1;
    return re.lastIndex - res[0].length;
};

RegExp.prototype.lastIndexOf = function(str, startIndex) {
    var src = /\$$/.test(this.source) && !/\\\$$/.test(this.source) ? this.source : this.source + '(?![\\S\\s]*' + this.source + ')';
    var re = new RegExp(src, 'g' + (this.ignoreCase ? 'i' : '') + (this.multiLine ? 'm' : ''));
    re.lastIndex = startIndex || 0;
    var res = re.exec(str);
    if(!res) return -1;
    return re.lastIndex - res[0].length;
};


/[abc]/.indexOf("tommy can eat");  // Returns 6
/[abc]/.indexOf("tommy can eat", 8);  // Returns 11
/[abc]/.lastIndexOf("tommy can eat"); // Returns 11

আমি কীভাবে এটিকে সংশোধন করছি তার একটি দ্রুত ব্যাখ্যা RegExp: কারণ indexOfআমাকে কেবলমাত্র বৈশ্বিক পতাকা সেট করা আছে তা নিশ্চিত করতে হবে। এর জন্য lastIndexOfআমি RegExpইতিমধ্যে স্ট্রিংয়ের শেষে ইতিমধ্যে মেলে না থাকলে শেষ ঘটনাটি অনুসন্ধান করতে নেতিবাচক চেহারা-এগিয়ে ব্যবহার করছি ।


4

এটি স্থানীয়ভাবে নয়, তবে আপনি অবশ্যই এই কার্যকারিতাটি যুক্ত করতে পারেন

<script type="text/javascript">

String.prototype.regexIndexOf = function( pattern, startIndex )
{
    startIndex = startIndex || 0;
    var searchResult = this.substr( startIndex ).search( pattern );
    return ( -1 === searchResult ) ? -1 : searchResult + startIndex;
}

String.prototype.regexLastIndexOf = function( pattern, startIndex )
{
    startIndex = startIndex === undefined ? this.length : startIndex;
    var searchResult = this.substr( 0, startIndex ).reverse().regexIndexOf( pattern, 0 );
    return ( -1 === searchResult ) ? -1 : this.length - ++searchResult;
}

String.prototype.reverse = function()
{
    return this.split('').reverse().join('');
}

// Indexes 0123456789
var str = 'caabbccdda';

alert( [
        str.regexIndexOf( /[cd]/, 4 )
    ,   str.regexLastIndexOf( /[cd]/, 4 )
    ,   str.regexIndexOf( /[yz]/, 4 )
    ,   str.regexLastIndexOf( /[yz]/, 4 )
    ,   str.lastIndexOf( 'd', 4 )
    ,   str.regexLastIndexOf( /d/, 4 )
    ,   str.lastIndexOf( 'd' )
    ,   str.regexLastIndexOf( /d/ )
    ]
);

</script>

আমি এই পদ্ধতিগুলি পুরোপুরি পরীক্ষা করিনি, তবে তারা এখনও পর্যন্ত কাজ করে বলে মনে হচ্ছে।


এই কেসগুলি পরিচালনা করতে আপডেট হয়েছে
পিটার বেইলি

যতবার আমি এই উত্তরটি গ্রহণ করতে চলেছি আমি একটি নতুন কেস খুঁজে পাচ্ছি! এগুলি বিভিন্ন ফলাফল দেয়! সতর্কতা ([str.lastIndexOf (/ [d] /, 4), str.regexLastIndexOf (/ [d] /, 4)]);
প্যাট

ভাল, অবশ্যই তারা - str.lastIndexOf এই স্ট্রিংতে রূপান্তরিত করে - প্যাটার্নটিতে ধরণের জবরদস্তি করবে। "/ [D] /" স্ট্রিংটি অবশ্যই ইনপুটটিতে পাওয়া যায়নি, সুতরাং -1 পাওয়াটি আসলে সঠিক।
পিটার বেইলি

বুঝেছি. স্ট্রিং.লাইস্ট ইন্ডেক্সঅফ () -তে অনুমিত বিবরণ পড়ার পরে - আমি কীভাবে এই যুক্তিটি কাজ করে তা ভুল বুঝেছিলাম। এই নতুন সংস্করণ এটি পরিচালনা করা উচিত।
পিটার বেইলি

কিছু এখনও ঠিক আছে না, তবে এটি দেরিতে হচ্ছে ... আমি একটি পরীক্ষার কেস নেওয়ার চেষ্টা করব, এবং সম্ভবত সকালে এটি ঠিক করব। এখনও পর্যন্ত সমস্যার জন্য দুঃখিত।
প্যাট

2

সমস্ত প্রস্তাবিত সমাধানগুলি আমার পরীক্ষাগুলি একরকম বা অন্যভাবে ব্যর্থ করার পরে (সম্পাদনা করুন: কিছু লেখার পরে পরীক্ষাগুলি পাস করার জন্য কিছু আপডেট হয়েছিল) আমি অ্যারে.ইন্ডেক্সফ এবং অ্যারে.লাইস্ট ইন্ডেক্সফের জন্য মোজিলা বাস্তবায়ন পেয়েছি

আমি স্ট্রিং.প্রোটোটাইপ.রেজেক্স ইন্ডেক্সঅফ এবং স্ট্রিং.প্রোটোটাইপ.রেজেক্সলাস্ট ইন্ডেক্সঅফের আমার সংস্করণটি প্রয়োগ করতে এগুলি ব্যবহার করেছি:

String.prototype.regexIndexOf = function(elt /*, from*/)
  {
    var arr = this.split('');
    var len = arr.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0) ? Math.ceil(from) : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++) {
      if (from in arr && elt.exec(arr[from]) ) 
        return from;
    }
    return -1;
};

String.prototype.regexLastIndexOf = function(elt /*, from*/)
  {
    var arr = this.split('');
    var len = arr.length;

    var from = Number(arguments[1]);
    if (isNaN(from)) {
      from = len - 1;
    } else {
      from = (from < 0) ? Math.ceil(from) : Math.floor(from);
      if (from < 0)
        from += len;
      else if (from >= len)
        from = len - 1;
    }

    for (; from > -1; from--) {
      if (from in arr && elt.exec(arr[from]) )
        return from;
    }
    return -1;
  };

তারা মনে করে যে আমি দেওয়া পরীক্ষার ফাংশনগুলি পাস করেছি।

স্পষ্টতই তারা কেবল তখনই কাজ করে যদি নিয়মিত প্রকাশটি একটি চরিত্রের সাথে মেলে তবে এটি আমার উদ্দেশ্যে যথেষ্ট যেহেতু আমি এটিকে ([এবিসি], \ এস, \ ডাব্লু, \ ডি) এর মতো জিনিসের জন্য ব্যবহার করব since

কেউ যদি আরও ভাল / দ্রুত / ক্লিনার / আরও জেনেরিক বাস্তবায়ন সরবরাহ করে যা কোনও নিয়মিত প্রকাশের ক্ষেত্রে কাজ করে তবে আমি প্রশ্নটি পর্যবেক্ষণ করব।


বাহ, এটি কোডের একটি দীর্ঘ বিট। আমার আপডেট হওয়া উত্তরটি যাচাই করুন এবং প্রতিক্রিয়া জানান। ধন্যবাদ।
জেসন বুটিং

এই বাস্তবায়নের লক্ষ্য ফায়ারফক্স এবং স্পাইডারমনকি জাভাস্ক্রিপ্ট ইঞ্জিনের সর্বশেষ ইনডেক্সফের সাথে নিখুঁত সামঞ্জস্যতার জন্য রয়েছে, বেশ কয়েকটি ক্ষেত্রে যা তর্কসাপেক্ষভাবে প্রান্তের ক্ষেত্রে রয়েছে। [...] রিয়েল-ওয়ার্ল্ড অ্যাপ্লিকেশনগুলিতে, আপনি যদি এগুলি উপেক্ষা করেন তবে আপনি কম জটিল কোড দিয়ে গণনা করতে সক্ষম হতে পারেন।
প্যাট

মজিলা পৃষ্ঠাটি গঠন করুন :-) আমি কোডের বিজ্ঞাপনটি দুটি প্রান্ত পরিবর্তন করে সমস্ত প্রান্তের কেস রেখেছি। পরীক্ষাগুলি পাস করার জন্য যেহেতু অন্যান্য উত্তরগুলির কয়েকটি দু'টি আপডেট করা হয়েছিল, তাই আমি সেগুলি বেঞ্চমার্ক করার চেষ্টা করব এবং সবচেয়ে কার্যকর হিসাবে গ্রহণ করব। আমার কাছে যখন ইস্যুটি পুনর্বিবেচনার সময় হবে।
প্যাট

আমি আমার সমাধানটি আপডেট করেছি এবং যে কোনও প্রতিক্রিয়া বা জিনিসগুলি এটি ব্যর্থ হওয়ার কারণের প্রশংসা করি। আমি মিশরএক্সএক্স দ্বারা চিহ্নিত ওভারল্যাপিং সমস্যাটি সমাধান করার জন্য একটি পরিবর্তন করেছি (আশা করি!)
জেসন

2

regexIndexOfঅ্যারের জন্য আমারও একটি ফাংশন দরকার ছিল , তাই আমি নিজেই প্রগ্রেম করেছি। তবে আমি সন্দেহ করি যে এটি অনুকূলিত, তবে আমার ধারণা এটি সঠিকভাবে কাজ করা উচিত।

Array.prototype.regexIndexOf = function (regex, startpos = 0) {
    len = this.length;
    for(x = startpos; x < len; x++){
        if(typeof this[x] != 'undefined' && (''+this[x]).match(regex)){
            return x;
        }
    }
    return -1;
}

arr = [];
arr.push(null);
arr.push(NaN);
arr[3] = 7;
arr.push('asdf');
arr.push('qwer');
arr.push(9);
arr.push('...');
console.log(arr);
arr.regexIndexOf(/\d/, 4);

1

কিছু সাধারণ ক্ষেত্রে, আপনি বিভক্ত ব্যবহার করে আপনার পিছনের দিকে অনুসন্ধান সহজ করতে পারেন।

function regexlast(string,re){
  var tokens=string.split(re);
  return (tokens.length>1)?(string.length-tokens[tokens.length-1].length):null;
}

এতে কয়েকটি গুরুতর সমস্যা রয়েছে:

  1. ওভারল্যাপিং ম্যাচগুলি প্রদর্শিত হবে না
  2. রিটার্নড ইনডেক্সটি ম্যাচের শেষের চেয়ে শুরু হওয়ার চেয়ে বেশি হয় (যদি আপনার রেজেক্সটি একটি ধ্রুবক হয় তবে জরিমানা)

তবে উজ্জ্বল দিকে এটি কম কোড। একটি ধ্রুবক দৈর্ঘ্যের রেইজেক্সের জন্য যা ওভারল্যাপ করতে পারে না ( /\s\w/শব্দের সীমানা সন্ধান করার মতো ) এটি যথেষ্ট ভাল।


0

বিরল ম্যাচ সহ ডেটাগুলির জন্য, স্ট্রিং.সার্ক ব্যবহার করা ব্রাউজারগুলির মধ্যে দ্রুততম। এটি প্রতিটি পুনরাবৃত্তিকে একটি স্ট্রিংকে পুনরায় টুকরো টুকরো করে দেয়:

function lastIndexOfSearch(string, regex, index) {
  if(index === 0 || index)
     string = string.slice(0, Math.max(0,index));
  var idx;
  var offset = -1;
  while ((idx = string.search(regex)) !== -1) {
    offset += idx + 1;
    string = string.slice(idx + 1);
  }
  return offset;
}

ঘন ডেটার জন্য আমি এটি তৈরি করেছি। এটি কার্যকর করার পদ্ধতির তুলনায় জটিল, তবে ঘন তথ্যের জন্য, আমি চেষ্টা করেছি এমন অন্যান্য পদ্ধতির তুলনায় এটি 2-10x দ্রুত এবং স্বীকৃত সমাধানের চেয়ে প্রায় 100x দ্রুত। মূল বিষয়গুলি হ'ল:

  1. এটি ম্যাচ রয়েছে কিনা তা যাচাই করতে বা শীঘ্রই প্রস্থান করতে একবারে পাস করা রেজেক্সে এক্সকে কল করে। আমি এটি ব্যবহার করে (? = অনুরূপ পদ্ধতিতে করি তবে আইই এক্সে এক্সিকিউটিভের সাথে পরীক্ষা করা নাটকীয়ভাবে দ্রুত হয়।
  2. এটি '(r) ফর্ম্যাটে একটি পরিবর্তিত রেজেক্স গঠন এবং ক্যাশে করে। (?! ? r) '
  3. নতুন রেজেক্স কার্যকর করা হয়েছে এবং সেই এক্সিকিউটিভ বা প্রথম এক্সিকিউটরের ফলাফলগুলি ফিরে আসে;

    function lastIndexOfGroupSimple(string, regex, index) {
        if (index === 0 || index) string = string.slice(0, Math.max(0, index + 1));
        regex.lastIndex = 0;
        var lastRegex, index
        flags = 'g' + (regex.multiline ? 'm' : '') + (regex.ignoreCase ? 'i' : ''),
        key = regex.source + '$' + flags,
        match = regex.exec(string);
        if (!match) return -1;
        if (lastIndexOfGroupSimple.cache === undefined) lastIndexOfGroupSimple.cache = {};
        lastRegex = lastIndexOfGroupSimple.cache[key];
        if (!lastRegex)
            lastIndexOfGroupSimple.cache[key] = lastRegex = new RegExp('.*(' + regex.source + ')(?!.*?' + regex.source + ')', flags);
        index = match.index;
        lastRegex.lastIndex = match.index;
        return (match = lastRegex.exec(string)) ? lastRegex.lastIndex - match[1].length : index;
    };

পদ্ধতিগুলির jscreen

আমি উপরের পরীক্ষাগুলির উদ্দেশ্য বুঝতে পারি না। যে পরিস্থিতিগুলির জন্য একটি রেজেক্স প্রয়োজন তাদের ইন্ডেক্সঅফের কলের সাথে তুলনা করা অসম্ভব, যা আমি মনে করি পদ্ধতিটি প্রথম স্থানে তৈরি করার বিষয়টি। পরীক্ষায় উত্তীর্ণ হওয়ার জন্য, রেজেক্স পুনরাবৃত্তি করার পদ্ধতিটি সামঞ্জস্য করার চেয়ে 'xxx + (?! X)' ব্যবহার করা আরও বোধগম্য।


0

জেসন বুটিংয়ের শেষ সূচকটি কাজ করে না। খনি অনুকূল নয়, তবে এটি কার্যকর হয়।

//Jason Bunting's
String.prototype.regexIndexOf = function(regex, startpos) {
var indexOf = this.substring(startpos || 0).search(regex);
return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf;
}

String.prototype.regexLastIndexOf = function(regex, startpos) {
var lastIndex = -1;
var index = this.regexIndexOf( regex );
startpos = startpos === undefined ? this.length : startpos;

while ( index >= 0 && index < startpos )
{
    lastIndex = index;
    index = this.regexIndexOf( regex, index + 1 );
}
return lastIndex;
}

আপনি কি এমন পরীক্ষা প্রদান করতে পারেন যা আমার ব্যর্থ হওয়ার কারণ হয়ে দাঁড়ায়? যদি আপনি খুঁজে পেয়েছেন যে এটি কাজ করে না, একটি পরীক্ষার কেস সরবরাহ করুন, কেন কেবল "এটি কাজ করে না" বলুন এবং স্থানে একটি অনুকূল-অনুকূল সমাধান সরবরাহ করবেন?
জেসন বুটিং

হু ছেলে আপনি পুরোপুরি ঠিক বলেছেন। আমার একটা উদাহরণ দেওয়া উচিত ছিল। দুর্ভাগ্যক্রমে আমি কয়েক মাস আগে এই কোড থেকে সরে এসেছি এবং ব্যর্থ কেসটি কী ছিল তার কোনও ধারণা নেই। : - /
এলি

ভাল, যেমন জীবন। :)
জেসন বুটিং 21

0

অনুরোধকৃত কার্য সম্পাদন করার মতো কোনও দেশীয় পদ্ধতি এখনও নেই।

আমি যে কোডটি ব্যবহার করছি তা এখানে। এটি স্ট্রিং.প্রোটোটাইপ.আইডিএক্সএক্স এবং স্ট্রিং.প্রোটোটাইপ.স্লাস্ট ইন্ডেক্সফের পদ্ধতিগুলির নকল করে তবে তারা অনুসন্ধানের মানটি উপস্থাপন করে এমন একটি স্ট্রিং ছাড়াও অনুসন্ধান আর্গুমেন্ট হিসাবে একটি রেজএক্সপ্রেসকে গ্রহণ করে।

হ্যাঁ এটি একটি উত্তর হিসাবে দীর্ঘ হিসাবে এটি বর্তমানের মানগুলি যতটা সম্ভব কাছাকাছি অনুসরণ করার চেষ্টা করে এবং অবশ্যই JSDOC মন্তব্যগুলির যুক্তিসঙ্গত পরিমাণ ধারণ করে । যাইহোক, একবার সংশোধন করা হলে, কোডটি কেবল ২.২k কে এবং একবার সঞ্চালনের জন্য জিপিপড হয় এটি কেবল 1023 বাইট।

এটি যে দুটি পদ্ধতি যুক্ত করে String.prototype( যেখানে উপলভ্য.ডাইনফাইনপ্রোটারি ব্যবহার করা যায়) তা হ'ল :

  1. searchOf
  2. searchLastOf

এটি ওপি পোস্ট করা সমস্ত পরীক্ষাগুলি পাস করে এবং অতিরিক্তভাবে আমি আমার প্রতিদিনের ব্যবহারে রুটিনগুলি বেশ ভালভাবে পরীক্ষা করে দেখেছি এবং তারা একাধিক পরিবেশে কাজ করে তা নিশ্চিত করার চেষ্টা করেছি, তবে প্রতিক্রিয়া / বিষয়গুলি সর্বদা স্বাগত।

/*jslint maxlen:80, browser:true */

/*
 * Properties used by searchOf and searchLastOf implementation.
 */

/*property
    MAX_SAFE_INTEGER, abs, add, apply, call, configurable, defineProperty,
    enumerable, exec, floor, global, hasOwnProperty, ignoreCase, index,
    lastIndex, lastIndexOf, length, max, min, multiline, pow, prototype,
    remove, replace, searchLastOf, searchOf, source, toString, value, writable
*/

/*
 * Properties used in the testing of searchOf and searchLastOf implimentation.
 */

/*property
    appendChild, createTextNode, getElementById, indexOf, lastIndexOf, length,
    searchLastOf, searchOf, unshift
*/

(function () {
    'use strict';

    var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1,
        getNativeFlags = new RegExp('\\/([a-z]*)$', 'i'),
        clipDups = new RegExp('([\\s\\S])(?=[\\s\\S]*\\1)', 'g'),
        pToString = Object.prototype.toString,
        pHasOwn = Object.prototype.hasOwnProperty,
        stringTagRegExp;

    /**
     * Defines a new property directly on an object, or modifies an existing
     * property on an object, and returns the object.
     *
     * @private
     * @function
     * @param {Object} object
     * @param {string} property
     * @param {Object} descriptor
     * @returns {Object}
     * @see https://goo.gl/CZnEqg
     */
    function $defineProperty(object, property, descriptor) {
        if (Object.defineProperty) {
            Object.defineProperty(object, property, descriptor);
        } else {
            object[property] = descriptor.value;
        }

        return object;
    }

    /**
     * Returns true if the operands are strictly equal with no type conversion.
     *
     * @private
     * @function
     * @param {*} a
     * @param {*} b
     * @returns {boolean}
     * @see http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.4
     */
    function $strictEqual(a, b) {
        return a === b;
    }

    /**
     * Returns true if the operand inputArg is undefined.
     *
     * @private
     * @function
     * @param {*} inputArg
     * @returns {boolean}
     */
    function $isUndefined(inputArg) {
        return $strictEqual(typeof inputArg, 'undefined');
    }

    /**
     * Provides a string representation of the supplied object in the form
     * "[object type]", where type is the object type.
     *
     * @private
     * @function
     * @param {*} inputArg The object for which a class string represntation
     *                     is required.
     * @returns {string} A string value of the form "[object type]".
     * @see http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.4.2
     */
    function $toStringTag(inputArg) {
        var val;
        if (inputArg === null) {
            val = '[object Null]';
        } else if ($isUndefined(inputArg)) {
            val = '[object Undefined]';
        } else {
            val = pToString.call(inputArg);
        }

        return val;
    }

    /**
     * The string tag representation of a RegExp object.
     *
     * @private
     * @type {string}
     */
    stringTagRegExp = $toStringTag(getNativeFlags);

    /**
     * Returns true if the operand inputArg is a RegExp.
     *
     * @private
     * @function
     * @param {*} inputArg
     * @returns {boolean}
     */
    function $isRegExp(inputArg) {
        return $toStringTag(inputArg) === stringTagRegExp &&
                pHasOwn.call(inputArg, 'ignoreCase') &&
                typeof inputArg.ignoreCase === 'boolean' &&
                pHasOwn.call(inputArg, 'global') &&
                typeof inputArg.global === 'boolean' &&
                pHasOwn.call(inputArg, 'multiline') &&
                typeof inputArg.multiline === 'boolean' &&
                pHasOwn.call(inputArg, 'source') &&
                typeof inputArg.source === 'string';
    }

    /**
     * The abstract operation throws an error if its argument is a value that
     * cannot be converted to an Object, otherwise returns the argument.
     *
     * @private
     * @function
     * @param {*} inputArg The object to be tested.
     * @throws {TypeError} If inputArg is null or undefined.
     * @returns {*} The inputArg if coercible.
     * @see https://goo.gl/5GcmVq
     */
    function $requireObjectCoercible(inputArg) {
        var errStr;

        if (inputArg === null || $isUndefined(inputArg)) {
            errStr = 'Cannot convert argument to object: ' + inputArg;
            throw new TypeError(errStr);
        }

        return inputArg;
    }

    /**
     * The abstract operation converts its argument to a value of type string
     *
     * @private
     * @function
     * @param {*} inputArg
     * @returns {string}
     * @see https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tostring
     */
    function $toString(inputArg) {
        var type,
            val;

        if (inputArg === null) {
            val = 'null';
        } else {
            type = typeof inputArg;
            if (type === 'string') {
                val = inputArg;
            } else if (type === 'undefined') {
                val = type;
            } else {
                if (type === 'symbol') {
                    throw new TypeError('Cannot convert symbol to string');
                }

                val = String(inputArg);
            }
        }

        return val;
    }

    /**
     * Returns a string only if the arguments is coercible otherwise throws an
     * error.
     *
     * @private
     * @function
     * @param {*} inputArg
     * @throws {TypeError} If inputArg is null or undefined.
     * @returns {string}
     */
    function $onlyCoercibleToString(inputArg) {
        return $toString($requireObjectCoercible(inputArg));
    }

    /**
     * The function evaluates the passed value and converts it to an integer.
     *
     * @private
     * @function
     * @param {*} inputArg The object to be converted to an integer.
     * @returns {number} If the target value is NaN, null or undefined, 0 is
     *                   returned. If the target value is false, 0 is returned
     *                   and if true, 1 is returned.
     * @see http://www.ecma-international.org/ecma-262/5.1/#sec-9.4
     */
    function $toInteger(inputArg) {
        var number = +inputArg,
            val = 0;

        if ($strictEqual(number, number)) {
            if (!number || number === Infinity || number === -Infinity) {
                val = number;
            } else {
                val = (number > 0 || -1) * Math.floor(Math.abs(number));
            }
        }

        return val;
    }

    /**
     * Copies a regex object. Allows adding and removing native flags while
     * copying the regex.
     *
     * @private
     * @function
     * @param {RegExp} regex Regex to copy.
     * @param {Object} [options] Allows specifying native flags to add or
     *                           remove while copying the regex.
     * @returns {RegExp} Copy of the provided regex, possibly with modified
     *                   flags.
     */
    function $copyRegExp(regex, options) {
        var flags,
            opts,
            rx;

        if (options !== null && typeof options === 'object') {
            opts = options;
        } else {
            opts = {};
        }

        // Get native flags in use
        flags = getNativeFlags.exec($toString(regex))[1];
        flags = $onlyCoercibleToString(flags);
        if (opts.add) {
            flags += opts.add;
            flags = flags.replace(clipDups, '');
        }

        if (opts.remove) {
            // Would need to escape `options.remove` if this was public
            rx = new RegExp('[' + opts.remove + ']+', 'g');
            flags = flags.replace(rx, '');
        }

        return new RegExp(regex.source, flags);
    }

    /**
     * The abstract operation ToLength converts its argument to an integer
     * suitable for use as the length of an array-like object.
     *
     * @private
     * @function
     * @param {*} inputArg The object to be converted to a length.
     * @returns {number} If len <= +0 then +0 else if len is +INFINITY then
     *                   2^53-1 else min(len, 2^53-1).
     * @see https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
     */
    function $toLength(inputArg) {
        return Math.min(Math.max($toInteger(inputArg), 0), MAX_SAFE_INTEGER);
    }

    /**
     * Copies a regex object so that it is suitable for use with searchOf and
     * searchLastOf methods.
     *
     * @private
     * @function
     * @param {RegExp} regex Regex to copy.
     * @returns {RegExp}
     */
    function $toSearchRegExp(regex) {
        return $copyRegExp(regex, {
            add: 'g',
            remove: 'y'
        });
    }

    /**
     * Returns true if the operand inputArg is a member of one of the types
     * Undefined, Null, Boolean, Number, Symbol, or String.
     *
     * @private
     * @function
     * @param {*} inputArg
     * @returns {boolean}
     * @see https://goo.gl/W68ywJ
     * @see https://goo.gl/ev7881
     */
    function $isPrimitive(inputArg) {
        var type = typeof inputArg;

        return type === 'undefined' ||
                inputArg === null ||
                type === 'boolean' ||
                type === 'string' ||
                type === 'number' ||
                type === 'symbol';
    }

    /**
     * The abstract operation converts its argument to a value of type Object
     * but fixes some environment bugs.
     *
     * @private
     * @function
     * @param {*} inputArg The argument to be converted to an object.
     * @throws {TypeError} If inputArg is not coercible to an object.
     * @returns {Object} Value of inputArg as type Object.
     * @see http://www.ecma-international.org/ecma-262/5.1/#sec-9.9
     */
    function $toObject(inputArg) {
        var object;

        if ($isPrimitive($requireObjectCoercible(inputArg))) {
            object = Object(inputArg);
        } else {
            object = inputArg;
        }

        return object;
    }

    /**
     * Converts a single argument that is an array-like object or list (eg.
     * arguments, NodeList, DOMTokenList (used by classList), NamedNodeMap
     * (used by attributes property)) into a new Array() and returns it.
     * This is a partial implementation of the ES6 Array.from
     *
     * @private
     * @function
     * @param {Object} arrayLike
     * @returns {Array}
     */
    function $toArray(arrayLike) {
        var object = $toObject(arrayLike),
            length = $toLength(object.length),
            array = [],
            index = 0;

        array.length = length;
        while (index < length) {
            array[index] = object[index];
            index += 1;
        }

        return array;
    }

    if (!String.prototype.searchOf) {
        /**
         * This method returns the index within the calling String object of
         * the first occurrence of the specified value, starting the search at
         * fromIndex. Returns -1 if the value is not found.
         *
         * @function
         * @this {string}
         * @param {RegExp|string} regex A regular expression object or a String.
         *                              Anything else is implicitly converted to
         *                              a String.
         * @param {Number} [fromIndex] The location within the calling string
         *                             to start the search from. It can be any
         *                             integer. The default value is 0. If
         *                             fromIndex < 0 the entire string is
         *                             searched (same as passing 0). If
         *                             fromIndex >= str.length, the method will
         *                             return -1 unless searchValue is an empty
         *                             string in which case str.length is
         *                             returned.
         * @returns {Number} If successful, returns the index of the first
         *                   match of the regular expression inside the
         *                   string. Otherwise, it returns -1.
         */
        $defineProperty(String.prototype, 'searchOf', {
            enumerable: false,
            configurable: true,
            writable: true,
            value: function (regex) {
                var str = $onlyCoercibleToString(this),
                    args = $toArray(arguments),
                    result = -1,
                    fromIndex,
                    match,
                    rx;

                if (!$isRegExp(regex)) {
                    return String.prototype.indexOf.apply(str, args);
                }

                if ($toLength(args.length) > 1) {
                    fromIndex = +args[1];
                    if (fromIndex < 0) {
                        fromIndex = 0;
                    }
                } else {
                    fromIndex = 0;
                }

                if (fromIndex >= $toLength(str.length)) {
                    return result;
                }

                rx = $toSearchRegExp(regex);
                rx.lastIndex = fromIndex;
                match = rx.exec(str);
                if (match) {
                    result = +match.index;
                }

                return result;
            }
        });
    }

    if (!String.prototype.searchLastOf) {
        /**
         * This method returns the index within the calling String object of
         * the last occurrence of the specified value, or -1 if not found.
         * The calling string is searched backward, starting at fromIndex.
         *
         * @function
         * @this {string}
         * @param {RegExp|string} regex A regular expression object or a String.
         *                              Anything else is implicitly converted to
         *                              a String.
         * @param {Number} [fromIndex] Optional. The location within the
         *                             calling string to start the search at,
         *                             indexed from left to right. It can be
         *                             any integer. The default value is
         *                             str.length. If it is negative, it is
         *                             treated as 0. If fromIndex > str.length,
         *                             fromIndex is treated as str.length.
         * @returns {Number} If successful, returns the index of the first
         *                   match of the regular expression inside the
         *                   string. Otherwise, it returns -1.
         */
        $defineProperty(String.prototype, 'searchLastOf', {
            enumerable: false,
            configurable: true,
            writable: true,
            value: function (regex) {
                var str = $onlyCoercibleToString(this),
                    args = $toArray(arguments),
                    result = -1,
                    fromIndex,
                    length,
                    match,
                    pos,
                    rx;

                if (!$isRegExp(regex)) {
                    return String.prototype.lastIndexOf.apply(str, args);
                }

                length = $toLength(str.length);
                if (!$strictEqual(args[1], args[1])) {
                    fromIndex = length;
                } else {
                    if ($toLength(args.length) > 1) {
                        fromIndex = $toInteger(args[1]);
                    } else {
                        fromIndex = length - 1;
                    }
                }

                if (fromIndex >= 0) {
                    fromIndex = Math.min(fromIndex, length - 1);
                } else {
                    fromIndex = length - Math.abs(fromIndex);
                }

                pos = 0;
                rx = $toSearchRegExp(regex);
                while (pos <= fromIndex) {
                    rx.lastIndex = pos;
                    match = rx.exec(str);
                    if (!match) {
                        break;
                    }

                    pos = +match.index;
                    if (pos <= fromIndex) {
                        result = pos;
                    }

                    pos += 1;
                }

                return result;
            }
        });
    }
}());

(function () {
    'use strict';

    /*
     * testing as follow to make sure that at least for one character regexp,
     * the result is the same as if we used indexOf
     */

    var pre = document.getElementById('out');

    function log(result) {
        pre.appendChild(document.createTextNode(result + '\n'));
    }

    function test(str) {
        var i = str.length + 2,
            r,
            a,
            b;

        while (i) {
            a = str.indexOf('a', i);
            b = str.searchOf(/a/, i);
            r = ['Failed', 'searchOf', str, i, a, b];
            if (a === b) {
                r[0] = 'Passed';
            }

            log(r);
            a = str.lastIndexOf('a', i);
            b = str.searchLastOf(/a/, i);
            r = ['Failed', 'searchLastOf', str, i, a, b];
            if (a === b) {
                r[0] = 'Passed';
            }

            log(r);
            i -= 1;
        }
    }

    /*
     * Look for the a among the xes
     */

    test('xxx');
    test('axx');
    test('xax');
    test('xxa');
    test('axa');
    test('xaa');
    test('aax');
    test('aaa');
}());
<pre id="out"></pre>


0

আপনি যদি রেজিএক্সপ এর সাথে খুব সাধারণ লাস্ট ইন্ডেক্স অনুসন্ধানের সন্ধান করছেন এবং যদি এটি সর্বশেষ বিবরণে লাস্ট ইন্ডেক্সের অনুকরণ করে তবে যত্নশীল না হন, এটি আপনার দৃষ্টি আকর্ষণ করতে পারে।

আমি কেবল স্ট্রিংটি বিপরীত করি এবং প্রথম উপস্থিতি সূচকটি দৈর্ঘ্য থেকে বিয়োগ করি - 1. এটি আমার পরীক্ষায় উত্তীর্ণ হয় তবে আমি মনে করি দীর্ঘ স্ট্রিংগুলির সাথে পারফরম্যান্সের সমস্যা দেখা দিতে পারে।

interface String {
  reverse(): string;
  lastIndex(regex: RegExp): number;
}

String.prototype.reverse = function(this: string) {
  return this.split("")
    .reverse()
    .join("");
};

String.prototype.lastIndex = function(this: string, regex: RegExp) {
  const exec = regex.exec(this.reverse());
  return exec === null ? -1 : this.length - 1 - exec.index;
};

0

আমি ব্যবহার করেছি String.prototype.match(regex)যা স্ট্রিংয়ে প্রদত্ত সমস্ত পাওয়া ম্যাচের একটি স্ট্রিং অ্যারে প্রদান regexকরে (আরও তথ্য এখানে দেখুন ):

function getLastIndex(text, regex, limit = text.length) {
  const matches = text.match(regex);

  // no matches found
  if (!matches) {
    return -1;
  }

  // matches found but first index greater than limit
  if (text.indexOf(matches[0] + matches[0].length) > limit) {
    return -1;
  }

  // reduce index until smaller than limit
  let i = matches.length - 1;
  let index = text.lastIndexOf(matches[i]);
  while (index > limit && i >= 0) {
    i--;
    index = text.lastIndexOf(matches[i]);
  }
  return index > limit ? -1 : index;
}

// expect -1 as first index === 14
console.log(getLastIndex('First Sentence. Last Sentence. Unfinished', /\. /g, 10));

// expect 29
console.log(getLastIndex('First Sentence. Last Sentence. Unfinished', /\. /g));


0
var mystring = "abc ab a";
var re  = new RegExp("ab"); // any regex here

if ( re.exec(mystring) != null ){ 
   alert("matches"); // true in this case
}

স্ট্যান্ডার্ড নিয়মিত এক্সপ্রেশন ব্যবহার করুন:

var re  = new RegExp("^ab");  // At front
var re  = new RegExp("ab$");  // At end
var re  = new RegExp("ab(c|d)");  // abc or abd

-2

ঠিক আছে, আপনি যেমন একটি চরিত্রের অবস্থান ঠিক মেলে খুঁজছেন তেমনই সম্ভবত রেগেক্স ওভারকিল।

আমি অনুমান করি আপনি যা চান তা হ'ল "এই চরিত্রের মধ্যে প্রথমটি অনুসন্ধান করুন" এর পরিবর্তে এই চরিত্রগুলির মধ্যে প্রথমটি সন্ধান করুন।

এটি অবশ্যই সহজ উত্তর, তবে আপনার প্রশ্নটি যা করতে শুরু করেছে তা রেগেক্স অংশ ব্যতীতই করে (কারণ আপনি কেন স্পষ্ট করে বলেননি কেন এটি কেন রেজেক্স হতে হবে)

function mIndexOf( str , chars, offset )
{
   var first  = -1; 
   for( var i = 0; i < chars.length;  i++ )
   {
      var p = str.indexOf( chars[i] , offset ); 
      if( p < first || first === -1 )
      {
           first = p;
      }
   }
   return first; 
}
String.prototype.mIndexOf = function( chars, offset )
{
   return mIndexOf( this, chars, offset ); # I'm really averse to monkey patching.  
};
mIndexOf( "hello world", ['a','o','w'], 0 );
>> 4 
mIndexOf( "hello world", ['a'], 0 );
>> -1 
mIndexOf( "hello world", ['a','o','w'], 4 );
>> 4
mIndexOf( "hello world", ['a','o','w'], 5 );
>> 6
mIndexOf( "hello world", ['a','o','w'], 7 );
>> -1 
mIndexOf( "hello world", ['a','o','w','d'], 7 );
>> 10
mIndexOf( "hello world", ['a','o','w','d'], 10 );
>> 10
mIndexOf( "hello world", ['a','o','w','d'], 11 );
>> -1

বানর প্যাচিং সম্পর্কে কেবল একটি মন্তব্য - যখন আমি এর সমস্যাগুলি সম্পর্কে সচেতন রয়েছি - আপনি কি মনে করেন বিশ্বব্যাপী নেমস্পেসকে দূষিত করা ভাল? এটি উভয় ক্ষেত্রে প্রতীক বিরোধের মতো হতে পারে না এবং সমস্যাটি দেখা দেওয়ার পরে মূলত একইভাবে মেরামত করা / মেরামত করা হয়।
পিটার বেইলি

ওয়েল, আমাকে সন্ধান করতে হবে এবং কিছু ক্ষেত্রে ডাব্লু এবং আশা করছিলাম যে আমাকে সমস্ত সম্ভাবনা গণনা করতে হবে না।
প্যাট

বেইলিপি: আপনি বিশ্বব্যাপী নেমস্পেস দূষণ ছাড়াই এই সমস্যাটি পেতে পারেন, উদাহরণস্বরূপ: jQuery দেখুন। যে মডেল ব্যবহার। প্রকল্পের জন্য একটি অবজেক্ট, আপনার জিনিসগুলি এর ভিতরে চলে যায়। মটুলগুলি আমার মুখে খারাপ স্বাদ ফেলেছে।
কেন্ট ফ্রেড্রিক

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