একটি স্ট্রিং থেকে নির্দিষ্ট অক্ষর ছাঁটুন


120

জাভাস্ক্রিপ্ট এর সমতুল্য কিC# পদ্ধতির :

var x = "|f|oo||"; 
var y = x.Trim('|'); //  "f|oo"

সি # নির্বাচিত চরিত্রটি কেবল স্ট্রিংয়ের শুরু এবং শেষের দিকে ছাঁটাই করে!

উত্তর:


155

একটি লাইন যথেষ্ট:

var x = '|f|oo||';
var y = x.replace(/^\|+|\|+$/g, '');
document.write(x + '<br />' + y);

^\|+   beginning of the string, pipe, one or more times
|      or
\|+$   pipe, one or more times, end of the string

একটি সাধারণ সমাধান:

function trim (s, c) {
  if (c === "]") c = "\\]";
  if (c === "\\") c = "\\\\";
  return s.replace(new RegExp(
    "^[" + c + "]+|[" + c + "]+$", "g"
  ), "");
}

chars = ".|]\\";
for (c of chars) {
  s = c + "foo" + c + c + "oo" + c + c + c;
  console.log(s, "->", trim(s, c));
}


35

যদি আমি ভালভাবে বুঝতে পারি তবে আপনি কোনও নির্দিষ্ট চরিত্রটি কেবল তখনই শুরু করতে চান যদি এটি স্ট্রিংয়ের শুরুতে বা শেষে হয় (যেমন: ||fo||oo||||হওয়া উচিত foo||oo)। আপনি নীচে একটি অ্যাডহক ফাংশন তৈরি করতে পারেন:

function trimChar(string, charToRemove) {
    while(string.charAt(0)==charToRemove) {
        string = string.substring(1);
    }

    while(string.charAt(string.length-1)==charToRemove) {
        string = string.substring(0,string.length-1);
    }

    return string;
}

আমি নীচের কোড দিয়ে এই ফাংশনটি পরীক্ষা করেছি:

var str = "|f|oo||";
$( "#original" ).html( "Original String: '" + str + "'" );
$( "#trimmed" ).html( "Trimmed: '" + trimChar(str, "|") + "'" );

3
আবর্জনা সংগ্রহকারীদের জন্য এটি একটি মজাদার পরীক্ষা হবে তবে আমি আপনার ক্লায়েন্টদের এটির অধীন সুপারিশ করব না।
সোরেনসেন

18

আপনি নিয়মিত প্রকাশটি ব্যবহার করতে পারেন যেমন:

var x = "|f|oo||";
var y = x.replace(/^[\|]+|[\|]+$/g, "");
alert(y); // f|oo

হালনাগাদ:

আপনি যদি কোনও ফাংশনে সাধারণীকরণ করতে চান তবে আপনি নিম্নলিখিতটি করতে পারেন:

var escapeRegExp = function(strToEscape) {
    // Escape special characters for use in a regular expression
    return strToEscape.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
};

var trimChar = function(origString, charToTrim) {
    charToTrim = escapeRegExp(charToTrim);
    var regEx = new RegExp("^[" + charToTrim + "]+|[" + charToTrim + "]+$", "g");
    return origString.replace(regEx, "");
};

var x = "|f|oo||";
var y = trimChar(x, "|");
alert(y); // f|oo

17

এই প্রশ্নটি আপ টু ডেট রাখার জন্য:

ES6 স্প্রেড অপারেটরটি ব্যবহার করে আমি রেজেক্স ফাংশনটি বেছে নিতে চাই এমন একটি পদ্ধতির এটি এখানে।

function trimByChar(string, character) {
  const first = [...string].findIndex(char => char !== character);
  const last = [...string].reverse().findIndex(char => char !== character);
  return string.substring(first, string.length - last);
}

@ ফ্যাবিয়ার মন্তব্যের পরে উন্নত সংস্করণ (কেবল একই অক্ষরযুক্ত স্ট্রিংগুলি পরিচালনা করতে পারে)

function trimByChar(string, character) {
  const arr = Array.from(string);
  const first = arr.indexOf(character);
  const last = arr.reverse().indexOf(character);
  return string.substring(first + 1, string.length - last - 1);
}

2
আমি জানি রেজিক্সগুলি এখানে অতিমাত্রায় কাটছে, তবে আপনি কেন এই বিশেষ প্রয়োগটি বেছে নেবেন?
নিকোলাস শ্যাঙ্কস

2
এই বাস্তবায়ন কারণ আমি ব্যক্তিগতভাবে এটি ভাল পাঠযোগ্য। কোনও রেজেক্স কেবল কারণ রায়জ ইঞ্জিনগুলির মধ্যে সিদ্ধান্ত "ট্রি" অনেক বড়। এবং বিশেষত কারণ ট্রিমিংয়ের জন্য ব্যবহৃত রেজিক্সগুলিতে ক্যোয়ারী অক্ষর রয়েছে যা রেজেক্স ইঞ্জিনের মধ্যে ব্যাকট্র্যাকিংয়ের দিকে পরিচালিত করে। এই জাতীয় ইঞ্জিনগুলি প্রায়শই বাইট-কোডে প্যাটার্নটি কম্পাইল করে মেশিনের নির্দেশাবলীর অনুরূপ। ইঞ্জিন তারপরে নির্দেশ থেকে নির্দেশে লাফিয়ে কোডটি চালায়। যখন কোনও নির্দেশ ব্যর্থ হয়, তারপরে ইনপুটটি মেলে অন্য কোনও উপায় সন্ধানের জন্য এটি ব্যাক ট্র্যাক করে। নেকের চেয়ে অনেক বেশি কাজ চলছে।
রবিন এফ

জবাব দেওয়ার জন্য ধন্যবাদ, যদিও আমি আপনাকে এটি ব্যাখ্যা করার জন্য চাইছিলাম যে আপনি কেন এটি অন্যান্য নন-রেজেক্স পদ্ধতিতে বেছে নিয়েছেন - আমি মনে করি যে কেবল "আমি এটি পাঠযোগ্য" বলে মনে করি find
নিকোলাস শ্যাঙ্কস

1
@RobinF। আপনি কী মনে করেন ফাইন্ড ইন্ডেক্স () এবং বিপরীত () এ লুপ থাকে না? আবার চিন্তা কর.
অ্যান্ড্রু

1
দুটি টীকাগুলি: ছাঁটাই করার জন্য কেবলমাত্র অক্ষরটির সংমিশ্রণকারী স্ট্রিংটি একেবারে ছাঁটাই করা হবে না। অন্য বিষয়টি হ'ল: স্প্রেড অপারেটরের সাথে স্ট্রিংটিকে একটি অ্যারে রূপান্তরিত করা বাবেলকে বিভ্রান্ত করবে এবং এটিকে রূপান্তর করবে [].concat(string)যা কাঙ্ক্ষিত ফলাফল নয়। ব্যবহার Array.from(string)কাজ করবে।
ফ্যাবিয়ান

14

একটি রেজেক্স-কম সংস্করণ যা চোখে সহজ:

const trim = (str, chars) => str.split(chars).filter(Boolean).join(chars);

ব্যবহারের ক্ষেত্রে যেখানে আমরা নিশ্চিত হয়েছি যে প্রান্তগুলি বন্ধ করে দেওয়া অক্ষরের পুনরাবৃত্তি নেই।


বেশ আকর্ষণীয় ... সুতরাং বিভাজন প্রতিটি const trim = (str, chars) => str.split(chars).filter(x => { Boolean(x); console.log(typeof(x), x, Boolean(x)); }).join(chars); const str = "#//#//abc#//test#//end#//"; console.log(trim(str, '#//'));
বিস্মৃতকৃত

10

যদি আপনি দীর্ঘতর স্ট্রিংয়ের সাথে কাজ করে থাকেন তবে আমি বিশ্বাস করি যে এটি বরাদ্দ স্ট্রিংয়ের সংখ্যা শূন্য বা একটিতে হ্রাস করে অন্যান্য বিকল্পগুলির সর্বাধিক কার্যকর করা উচিত:

function trim(str, ch) {
    var start = 0, 
        end = str.length;

    while(start < end && str[start] === ch)
        ++start;

    while(end > start && str[end - 1] === ch)
        --end;

    return (start > 0 || end < str.length) ? str.substring(start, end) : str;
}

// Usage:
trim('|hello|world|', '|'); // => 'hello|world'

অথবা আপনি যদি একাধিক অক্ষরের একটি সেট থেকে ছাঁটাতে চান:

function trimAny(str, chars) {
    var start = 0, 
        end = str.length;

    while(start < end && chars.indexOf(str[start]) >= 0)
        ++start;

    while(end > start && chars.indexOf(str[end - 1]) >= 0)
        --end;

    return (start > 0 || end < str.length) ? str.substring(start, end) : str;
}

// Usage:
trimAny('|hello|world   ', [ '|', ' ' ]); // => 'hello|world'
// because '.indexOf' is used, you could also pass a string for the 2nd parameter:
trimAny('|hello| world  ', '| '); // => 'hello|world'

সম্পাদনা: মজাদার জন্য, শব্দগুলি ছাঁটাই (স্বতন্ত্র অক্ষরের পরিবর্তে)

// Helper function to detect if a string contains another string
//     at a specific position. 
// Equivalent to using `str.indexOf(substr, pos) === pos` but *should* be more efficient on longer strings as it can exit early (needs benchmarks to back this up).
function hasSubstringAt(str, substr, pos) {
    var idx = 0, len = substr.length;

    for (var max = str.length; idx < len; ++idx) {
        if ((pos + idx) >= max || str[pos + idx] != substr[idx])
            break;
    }

    return idx === len;
}

function trimWord(str, word) {
    var start = 0,
        end = str.length,
        len = word.length;

    while (start < end && hasSubstringAt(str, word, start))
        start += word.length;

    while (end > start && hasSubstringAt(str, word, end - len))
        end -= word.length

    return (start > 0 || end < str.length) ? str.substring(start, end) : str;
}

// Usage:
trimWord('blahrealmessageblah', 'blah');

1
আমি এই সমাধানটি পছন্দ করি কারণ এটি আসলে সংক্ষিপ্ত হওয়ার চেয়ে বাস্তবে দক্ষ।
টেকহেইড

আমি এটি পছন্দ করা উচিত সম্মত। আমি যে উত্তর দিয়েছি তা বাতিল করে দেয়।
তমুসজেরোয়েস

9

এটি একসাথে বেশ কয়েকটি অক্ষর ছাঁটাই করতে পারে:

String.prototype.trimChars = function (c) {
  var re = new RegExp("^[" + c + "]+|[" + c + "]+$", "g");
  return this.replace(re,"");
}

var x = "|f|oo||"; 
x =  x.trimChars('|'); // f|oo

var y = "..++|f|oo||++..";
y = y.trimChars('|.+'); // f|oo

var z = "\\f|oo\\"; // \f|oo\

// For backslash, remember to double-escape:
z = z.trimChars("\\\\"); // f|oo

@ ফুবু: না, সত্যই নয়। এটি একটি ডেমো, যদি আপনি এটি কোনও কনসোলে পেস্ট করেন তবে এটি কেবল ফলাফল মুদ্রণ করবে। তবে আমি বুঝতে পারি এটি বিভ্রান্তিকর হতে পারে, তাই আমি এটি সম্পাদনা করেছি।
মার্লার 12

2

আপনি যদি আপনার প্রোগ্রামে এই ফাংশনগুলি সংজ্ঞায়িত করেন তবে আপনার স্ট্রিংগুলিতে একটি আপগ্রেড সংস্করণ থাকবে trimযা প্রদত্ত সমস্ত অক্ষর ছাঁটাই করতে পারে:

String.prototype.trimLeft = function(charlist) {
	if (charlist === undefined)
	charlist = "\s";

	return this.replace(new RegExp("^[" + charlist + "]+"), "");
};

String.prototype.trim = function(charlist) {
	return this.trimLeft(charlist).trimRight(charlist);
};

String.prototype.trimRight = function(charlist) {
	if (charlist === undefined)
	charlist = "\s";

	return this.replace(new RegExp("[" + charlist + "]+$"), "");
};

var withChars = "/-center-/"
var withoutChars = withChars.trim("/-")
document.write(withoutChars)

উৎস

https://www.sitepoint.com/trimming-strings-in-javascript/


1

আমার জ্ঞানের কাছে, jQuery এর যে পদ্ধতি সম্পর্কে আপনি জিজ্ঞাসা করছেন তার কোনও বিল্ট ইন ফাংশন নেই। তবে জাভাস্ক্রিপ্টের সাহায্যে আপনি কেবল আপনার স্ট্রিংয়ের সামগ্রী পরিবর্তন করতে প্রতিস্থাপনটি ব্যবহার করতে পারেন:

x.replace(/|/i, ""));

এটি | এর সমস্ত উপস্থিতি প্রতিস্থাপন করবে কিছুর সাথে না.


অপসারণ করার উপায় আছে | শুধু শুরু / শেষে?
fubo

আসলে আমি মনে করি এই পোস্টটি আপনার আপনার প্রশ্নে গতি সবচেয়ে আপ পেতে হবে: stackoverflow.com/questions/20196088/...
ওলে Haugset

@ ফুবু শিওর ... $এই প্রান্তটি কেবল শেষে শেষের দিকে নিক্ষেপ করুন : "||spam|||".replace(/\|+$/g, "")বা ^এটি শুরুতে কেবল এর মতো:"||spam|||".replace(/^\|+/g, "")
রাফিন

1

এটি একটি সমস্ত নেতৃস্থানীয় এবং পেছনের সীমানা ছাঁটাচ্ছে

const trim = (str, delimiter) => {
  const pattern = `[^\\${delimiter}]`;
  const start = str.search(pattern);
  const stop = str.length - str.split('').reverse().join('').search(pattern);
  return str.substring(start, stop);
}

const test = '||2|aaaa12bb3ccc|||||';
console.log(trim(test, '|')); // 2|aaaa12bb3ccc

1

আমি লোডাসের দিকে তাকানোর পরামর্শ দেব এবং তারা কীভাবে এটি প্রয়োগ করে trim ফাংশনটি ।

ডকুমেন্টেশন এবং উত্সের জন্য লোডাশ ট্রিম দেখুন সঠিক কোডটি দেখতে ।

আমি জানি এটি আপনার প্রশ্নের সঠিক উত্তর সরবরাহ করে না, তবে আমি মনে করি যে এ জাতীয় প্রশ্নে একটি লাইব্রেরির জন্য একটি রেফারেন্স সেট করা ভাল কারণ অন্যরা এটির পক্ষে দরকারী বলে মনে হতে পারে।


1
@ তমুসজেউইস একই নয়
জিডিবিডেবল

@ দেবী আমি কেবল একমত হতে পারি মন্তব্য করার জন্য আপনাকে ধন্যবাদ. ভাল উত্তর একটি সম্প্রদায় সমর্থিত সরঞ্জাম খুঁজছেন।
TamusJRoyce

1

এই কাজটি সমাধানের সর্বোত্তম উপায় হ'ল (পিএইচপি trimফাংশনের সাথে সমান ):

function trim( str, charlist ) {
  if ( typeof charlist == 'undefined' ) {
    charlist = '\\s';
  }
  
  var pattern = '^[' + charlist + ']*(.*?)[' + charlist + ']*$';
  
  return str.replace( new RegExp( pattern ) , '$1' )
}

document.getElementById( 'run' ).onclick = function() {
  document.getElementById( 'result' ).value = 
  trim( document.getElementById( 'input' ).value,
  document.getElementById( 'charlist' ).value);
}
<div>
  <label for="input">Text to trim:</label><br>
  <input id="input" type="text" placeholder="Text to trim" value="dfstextfsd"><br>
  <label for="charlist">Charlist:</label><br>
  <input id="charlist" type="text" placeholder="Charlist" value="dfs"><br>
  <label for="result">Result:</label><br>
  <input id="result" type="text" placeholder="Result" disabled><br>
  <button type="button" id="run">Trim it!</button>
</div>

পিএস: কেন আমি আমার উত্তর পোস্ট করেছি, যখন বেশিরভাগ লোক ইতিমধ্যে এটি করে ফেলেছে? কারণ আমি সেখানে উত্তরগুলির মধ্যে "সেরা" ভুলটি পেয়েছি: সকলেই '*' এর পরিবর্তে '+' মেটা ব্যবহার করেছে, কারণ trimতারা শুরু এবং / অথবা সমাপ্ত হয়, তবে অন্য ক্ষেত্রে এটি মূল স্ট্রিংটি ফিরে আসবে ।


0

@ লেফের উত্তরে প্রসারিত, এখানে একাধিক অক্ষর নেওয়া যেতে পারে:

var trim = function (s, t) {
  var tr, sr
  tr = t.split('').map(e => `\\\\${e}`).join('')
  sr = s.replace(new RegExp(`^[${tr}]+|[${tr}]+$`, 'g'), '')
  return sr
}

0

আমি @ Pho3niX83 থেকে সমাধানটি পছন্দ করি ...

আসুন এটি "চর" পরিবর্তে "শব্দ" দিয়ে প্রসারিত করুন ...

function trimWord(_string, _word) {

    var splitted = _string.split(_word);

    while (splitted.length && splitted[0] === "") {
        splitted.shift();
    }
    while (splitted.length && splitted[splitted.length - 1] === "") {
        splitted.pop();
    }
    return splitted.join(_word);
};


0
"|Howdy".replace(new RegExp("^\\|"),"");

(ডাবল পলায়ন নোট করুন। \\প্রয়োজন, স্ট্রিং মধ্যে আসলে একক স্ল্যাশ আছে , যা পরে RegExp| এ পালানোর দিকে পরিচালিত করে )।

কেবলমাত্র কয়েকটি অক্ষরেরই রেজিপ্যাক্স-এস্কেপিং প্রয়োজন। তাদের মধ্যে পাইপ অপারেটর।



-1
String.prototype.TrimStart = function (n) {
    if (this.charAt(0) == n)
        return this.substr(1);
};

String.prototype.TrimEnd = function (n) {
    if (this.slice(-1) == n)
        return this.slice(0, -1);
};

এটি কেবলমাত্র একটি ঘটনা সরিয়ে ফেলবে, তবে চরিত্রটি পুরোপুরি ছাঁটা না হওয়া পর্যন্ত ছাঁটা যায় না
কোয়ালা বিয়ার

1
ডিফল্ট স্ট্রিং প্রোটোটাইপটি ওভাররাইড করবেন না বা আপনি পরে সমস্যা চাইছেন। অন্যত্র আপনার নিজস্ব আলাদা ফাংশন তৈরি করুন।
রোবি

-2

এই পদ্ধতিটি ব্যবহার করে দেখুন:

var a = "anan güzel mi?";
if (a.endsWith("?"))   a = a.slice(0, -1);  
document.body.innerHTML = a;


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