Yanıtlar:
Bunu deneyebilirsin
var mySubString = str.substring(
str.lastIndexOf(":") + 1,
str.lastIndexOf(";")
);
Bunu da deneyebilirsiniz:
var str = 'one:two;three';
str.split(':').pop().split(';')[0]; // returns 'two'
str.split(':').pop().split(';')[0]
kullanmaktan daha hızlı olabilir.shift()
kullanım split()
var s = 'MyLongString:StringIWant;';
var arrStr = s.split(/[:;]/);
alert(arrStr);
arrStr
tarafından sınırlandırılan tüm dizeyi içerir :
veya ;
So ile her dizeye erişirfor-loop
for(var i=0; i<arrStr.length; i++)
alert(arrStr[i]);
\[(.*?)\]
---> Kısacası [] normal ifadedeki karakter sınıfını gösterdiğinden köşeli parantezlerden kaçmanız gerekir.
@Babasaheb Gosavi Cevabı, alt dizelerden biri (":" ve ";") varsa mükemmeldir. ancak birden fazla tekrarlamanız olduğunda, biraz zor olabilir.
Birden fazla projede çalışmak için bulduğum en iyi çözüm, bir nesnenin içinde dört yöntem kullanmaktır.
Yeterince konuşalım, kodu görelim:
var getFromBetween = {
results:[],
string:"",
getFromBetween:function (sub1,sub2) {
if(this.string.indexOf(sub1) < 0 || this.string.indexOf(sub2) < 0) return false;
var SP = this.string.indexOf(sub1)+sub1.length;
var string1 = this.string.substr(0,SP);
var string2 = this.string.substr(SP);
var TP = string1.length + string2.indexOf(sub2);
return this.string.substring(SP,TP);
},
removeFromBetween:function (sub1,sub2) {
if(this.string.indexOf(sub1) < 0 || this.string.indexOf(sub2) < 0) return false;
var removal = sub1+this.getFromBetween(sub1,sub2)+sub2;
this.string = this.string.replace(removal,"");
},
getAllResults:function (sub1,sub2) {
// first check to see if we do have both substrings
if(this.string.indexOf(sub1) < 0 || this.string.indexOf(sub2) < 0) return;
// find one result
var result = this.getFromBetween(sub1,sub2);
// push it to the results array
this.results.push(result);
// remove the most recently found one from the string
this.removeFromBetween(sub1,sub2);
// if there's more substrings
if(this.string.indexOf(sub1) > -1 && this.string.indexOf(sub2) > -1) {
this.getAllResults(sub1,sub2);
}
else return;
},
get:function (string,sub1,sub2) {
this.results = [];
this.string = string;
this.getAllResults(sub1,sub2);
return this.results;
}
};
var str = 'this is the haystack {{{0}}} {{{1}}} {{{2}}} {{{3}}} {{{4}}} some text {{{5}}} end of haystack';
var result = getFromBetween.get(str,"{{{","}}}");
console.log(result);
// returns: [0,1,2,3,4,5]
RangeError: Maximum call stack size exceeded
istisna.
var s = 'MyLongString:StringIWant;';
/:([^;]+);/.exec(s)[1]; // StringIWant
Bu yöntemi seviyorum:
var str = 'MyLongString:StringIWant;';
var tmpStr = str.match(":(.*);");
var newStr = tmpStr[1];
//newStr now contains 'StringIWant'
@Tsds yolunu kullandım ama sadece split işlevini kullanarak.
var str = 'one:two;three';
str.split(':')[1].split(';')[0] // returns 'two'
Dikkat kelimesi: dizinin '1' dizinine erişen dizede ":" yoksa bir hata atar! str.split ( ':') [1]
bu nedenle belirsizlik varsa @tsds yolu daha güvenlidir
str.split(':').pop().split(';')[0]
function substringBetween(s, a, b) {
var p = s.indexOf(a) + a.length;
return s.substring(p, s.indexOf(b, p));
}
// substringBetween('MyLongString:StringIWant;', ':', ';') -> StringIWant
// substringBetween('MyLongString:StringIWant;;', ':', ';') -> StringIWant
// substringBetween('MyLongString:StringIWant;:StringIDontWant;', ':', ';') -> StringIWant
Çıkartıcınızın 'derlenmiş' sürümünü döndürmek için daha yüksek bir sipariş işlevi kullanabilirsiniz, böylece daha hızlı olur.
Normal ifadelerle ve normal kapanışta bir kez derlendiğinde Javascript'in maçı tüm eşleşmeleri döndürür.
Bu bizi sadece belirteçlerimiz olarak kullandığımız şeyleri (yani:) kaldırmak zorunda bırakıyor {{
ve bunun için dilimle dize uzunluğunu kullanabiliriz.
function extract([beg, end]) {
const matcher = new RegExp(`${beg}(.*?)${end}`,'gm');
const normalise = (str) => str.slice(beg.length,end.length*-1);
return function(str) {
return str.match(matcher).map(normalise);
}
}
Bir kez derleyin ve birden çok kez kullanın ...
const stringExtractor = extract(['{','}']);
const stuffIneed = stringExtractor('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]
Veya tek seferlik kullanım ...
const stuffIneed = extract(['{','}'])('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]
Ayrıca Javascript'in replace
işlevine bakın, ancak değiştirme argümanı için bir işlev kullanarak (örneğin bir mini şablon motoru (dize enterpolasyonu) yapıyorsanız bunu yapardınız ... lodash.get, istediğiniz değerleri almak için de yardımcı olabilir. ile değiştirin ? ...
Cevabım çok uzun ama birisine yardım edebilir!
Bunu da kullanabilirsiniz ...
function extractText(str,delimiter){
if (str && delimiter){
var firstIndex = str.indexOf(delimiter)+1;
var lastIndex = str.lastIndexOf(delimiter);
str = str.substring(firstIndex,lastIndex);
}
return str;
}
var quotes = document.getElementById("quotes");
// " - represents quotation mark in HTML
<div>
<div>
<span id="at">
My string is @between@ the "at" sign
</span>
<button onclick="document.getElementById('at').innerText = extractText(document.getElementById('at').innerText,'@')">Click</button>
</div>
<div>
<span id="quotes">
My string is "between" quotes chars
</span>
<button onclick="document.getElementById('quotes').innerText = extractText(document.getElementById('quotes').innerText,'"')">Click</button>
</div>
</div>
İki alt dize arasında dize alın (1'den fazla karakter içerir)
function substrInBetween(whole_str, str1, str2){
if (whole_str.indexOf(str1) === -1 || whole_str.indexOf(str2) === -1) {
return undefined; // or ""
}
strlength1 = str1.length;
return whole_str.substring(
whole_str.indexOf(str1) + strlength1,
whole_str.indexOf(str2)
);
}
Not Bunun indexOf()
yerine lastIndexOf()
bu dizelerin ilk oluşumlarını kontrol edecek şekilde kullanıyorum
strlength1
değişkenin amacı nedir? Değer, satır içi olarak kullanılmalıdır. Ayrıca hangi vaka stilini kullandığınız da belli değil . strlength1
- stil yok, whole_str
- yılan çantası.
Javascript kullanarak iki karakter arasında alt dize almak için bunu deneyin.
$("button").click(function(){
var myStr = "MyLongString:StringIWant;";
var subStr = myStr.match(":(.*);");
alert(subStr[1]);
});
JQuery kullanma :
get_between <- function(str, first_character, last_character) {
new_str = str.match(first_character + "(.*)" + last_character)[1].trim()
return(new_str)
}
sicim
my_string = 'and the thing that ! on the @ with the ^^ goes now'
kullanım :
get_between(my_string, 'that', 'now')
sonuç :
"! on the @ with the ^^ goes
Küçük bir işlev arasında dizeyi tutabilir ve (isteğe bağlı olarak) belirli bir dizin kapmak için eşleşen birkaç kelime atlayabilirsiniz.
Ayrıca, ayar start
için false
dizenin başlangıcını kullanacak ve ayar end
için false
dize sonuna kullanacaktır.
kullanmak istediğiniz metnin pos1
konumuna ayarlandığında ,start
1
start
pos2
aynı şeyi yapar pos1
, ama için end
ve 1
ilk geçtiği kullanacak end
sonra start
, sık geçtiğine end
önce start
göz ardı edilir.
function getStringBetween(str, start=false, end=false, pos1=1, pos2=1){
var newPos1 = 0;
var newPos2 = str.length;
if(start){
var loops = pos1;
var i = 0;
while(loops > 0){
if(i > str.length){
break;
}else if(str[i] == start[0]){
var found = 0;
for(var p = 0; p < start.length; p++){
if(str[i+p] == start[p]){
found++;
}
}
if(found >= start.length){
newPos1 = i + start.length;
loops--;
}
}
i++;
}
}
if(end){
var loops = pos2;
var i = newPos1;
while(loops > 0){
if(i > str.length){
break;
}else if(str[i] == end[0]){
var found = 0;
for(var p = 0; p < end.length; p++){
if(str[i+p] == end[p]){
found++;
}
}
if(found >= end.length){
newPos2 = i;
loops--;
}
}
i++;
}
}
var result = '';
for(var i = newPos1; i < newPos2; i++){
result += str[i];
}
return result;
}