Odpowiedzi:
Możesz tego spróbować
var mySubString = str.substring(
str.lastIndexOf(":") + 1,
str.lastIndexOf(";")
);
Możesz także spróbować tego:
var str = 'one:two;three';
str.split(':').pop().split(';')[0]; // returns 'two'
str.split(':').pop().split(';')[0]
może być szybszy niż używanie.shift()
Posługiwać się split()
var s = 'MyLongString:StringIWant;';
var arrStr = s.split(/[:;]/);
alert(arrStr);
arrStr
będzie zawierać wszystkie ciągi rozdzielone przez :
lub ;
Więc dostęp do każdego ciągu przezfor-loop
for(var i=0; i<arrStr.length; i++)
alert(arrStr[i]);
\[(.*?)\]
---> Krótko mówiąc, musisz uciec od nawiasów kwadratowych, ponieważ [] oznacza klasę znaków w wyrażeniu regularnym.
@Babasaheb Gosavi Answer jest idealny, jeśli masz jedno wystąpienie podciągów („:” i „;”). ale gdy wystąpi wiele wystąpień, może to być nieco trudne.
Najlepszym rozwiązaniem, jakie wymyśliłem do pracy nad wieloma projektami, jest użycie czterech metod wewnątrz obiektu.
Tyle gadania, zobaczmy kod:
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
wyjątku.
var s = 'MyLongString:StringIWant;';
/:([^;]+);/.exec(s)[1]; // StringIWant
Podoba mi się ta metoda:
var str = 'MyLongString:StringIWant;';
var tmpStr = str.match(":(.*);");
var newStr = tmpStr[1];
//newStr now contains 'StringIWant'
Użyłem @tsds sposób, ale tylko przy użyciu funkcji podziału.
var str = 'one:two;three';
str.split(':')[1].split(';')[0] // returns 'two'
słowo ostrzeżenia: jeśli therre nie ma „:” w ciągu dostępu do indeksu „1” tablicy wyrzuci błąd! str.split (':') [1]
dlatego droga @tsds jest bezpieczniejsza, jeśli istnieje niepewność
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
Możesz użyć funkcji wyższego rzędu, aby zwrócić „skompilowaną” wersję swojego ekstraktora, dzięki czemu jest szybszy.
Dzięki wyrażeniom regularnym i kompilowaniu wyrażenia regularnego po zamknięciu dopasowanie JavaScript zwróci wszystkie dopasowania.
To pozostawia nam jedynie konieczność usuwania tego, co wykorzystaliśmy jako nasze znaczniki (tj .:), {{
i możemy użyć do tego długości łańcucha z plasterkiem.
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);
}
}
Skompiluj raz i użyj wiele razy ...
const stringExtractor = extract(['{','}']);
const stuffIneed = stringExtractor('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]
Lub jednorazowe użycie ...
const stuffIneed = extract(['{','}'])('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]
Spójrz także na replace
funkcję Javascript, ale używając funkcji zastępującej argument (Zrobiłbyś to, jeśli na przykład robiłeś silnik mini szablonów (interpolacja ciągów) ... lodash.get może być również pomocny, aby uzyskać wartości, które chcesz zamienić ? ...
Moja odpowiedź jest za długa, ale może komuś pomóc!
Możesz także użyć tego ...
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>
Uzyskaj ciąg między dwoma podciągami (zawiera więcej niż 1 znak)
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)
);
}
Uwaga: Używam indexOf()
zamiast, lastIndexOf()
więc sprawdzi po raz pierwszy te ciągi
strlength1
zmiennej? Zamiast tego należy użyć wartości wbudowanej. Nie jest również jasne, jakiego stylu obudowy używasz. strlength1
- bez stylu, whole_str
- skrzynia węża.
Spróbuj tego, aby uzyskać podciąg między dwoma znakami za pomocą javascript.
$("button").click(function(){
var myStr = "MyLongString:StringIWant;";
var subStr = myStr.match(":(.*);");
alert(subStr[1]);
});
Zaczerpnięte z @ Znajdź podciąg między dwoma znakami za pomocą jQuery
Korzystanie z jQuery :
get_between <- function(str, first_character, last_character) {
new_str = str.match(first_character + "(.*)" + last_character)[1].trim()
return(new_str)
}
strunowy
my_string = 'and the thing that ! on the @ with the ^^ goes now'
użycie :
get_between(my_string, 'that', 'now')
wynik :
"! on the @ with the ^^ goes
Stworzyłem małą funkcję, która może przechwytywać ciąg między, i może (opcjonalnie) pomijać kilka dopasowanych słów, aby pobrać określony indeks.
Ponadto ustawienie start
na false
użyje początku łańcucha, a ustawienie end
na false
użyje końca łańcucha.
ustawiony pos1
na pozycję start
tekstu, którego chcesz użyć, 1
użyje pierwszego wystąpieniastart
pos2
robi to samo co pos1
, ale dla end
i 1
użyje pierwszego wystąpienia end
dopiero po start
, wystąpienia end
wcześniej start
są ignorowane.
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;
}