Câu trả lời:
Bạn có thể thử cái này
var mySubString = str.substring(
str.lastIndexOf(":") + 1,
str.lastIndexOf(";")
);
Bạn cũng có thể thử điều này:
var str = 'one:two;three';
str.split(':').pop().split(';')[0]; // returns 'two'
str.split(':').pop().split(';')[0]
có thể nhanh hơn sử dụng.shift()
Sử dụng split()
var s = 'MyLongString:StringIWant;';
var arrStr = s.split(/[:;]/);
alert(arrStr);
arrStr
sẽ chứa tất cả các chuỗi được phân tách bằng :
hoặc ;
Vì vậy, truy cập mọi chuỗi thông quafor-loop
for(var i=0; i<arrStr.length; i++)
alert(arrStr[i]);
\[(.*?)\]
---> Tóm lại, bạn cần thoát dấu ngoặc vuông, vì [] biểu thị lớp ký tự trong regex.
@Babasaheb Gosavi Trả lời là hoàn hảo nếu bạn có một lần xuất hiện của chuỗi con (":" và ";"). nhưng một khi bạn có nhiều lần xuất hiện, nó có thể gặp một chút khó khăn.
Giải pháp tốt nhất tôi đã đưa ra để làm việc trên nhiều dự án là sử dụng bốn phương thức bên trong một đối tượng.
Nói đủ rồi, hãy xem mã:
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
ngoại lệ.
var s = 'MyLongString:StringIWant;';
/:([^;]+);/.exec(s)[1]; // StringIWant
Tôi thích phương pháp này:
var str = 'MyLongString:StringIWant;';
var tmpStr = str.match(":(.*);");
var newStr = tmpStr[1];
//newStr now contains 'StringIWant'
Tôi đã sử dụng cách @tsds nhưng chỉ bằng cách sử dụng chức năng phân tách.
var str = 'one:two;three';
str.split(':')[1].split(';')[0] // returns 'two'
từ thận trọng: nếu có là không ":" trong chuỗi truy cập chỉ mục '1' của mảng sẽ gây ra lỗi! str.split (':') [1]
do đó cách @tsds an toàn hơn nếu có sự không chắc chắn
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
Bạn có thể sử dụng hàm bậc cao hơn để trả về phiên bản 'đã biên dịch' của trình trích xuất của mình, theo cách đó nhanh hơn.
Với regexes và biên dịch regex một lần trong bao đóng, trận đấu của Javascript sẽ trả về tất cả các trận đấu.
Điều này khiến chúng ta chỉ phải xóa những gì chúng ta đã sử dụng làm điểm đánh dấu (ví dụ {{
:) và chúng ta có thể sử dụng độ dài chuỗi cho phần này bằng lát cắt.
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);
}
}
Biên dịch một lần và sử dụng nhiều lần ...
const stringExtractor = extract(['{','}']);
const stuffIneed = stringExtractor('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]
Hoặc sử dụng một lần ...
const stuffIneed = extract(['{','}'])('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]
Cũng xem replace
chức năng của Javascript nhưng sử dụng hàm cho đối số thay thế (Bạn sẽ làm điều đó nếu ví dụ bạn đang thực hiện một công cụ mẫu nhỏ (nội suy chuỗi) ... lodash.get cũng có thể hữu ích sau đó để có được các giá trị bạn muốn thay thế bằng ? ...
Câu trả lời của tôi quá dài nhưng nó có thể giúp được ai đó!
Bạn cũng có thể sử dụng cái này ...
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>
lấy chuỗi giữa các chuỗi con (chứa nhiều hơn 1 ký tự)
function substrInBetween(whole_str, str1, str2){
strlength1 = str1.length;
return whole_str.substring(
whole_str.indexOf(str1) + strlength1,
whole_str.indexOf(str2)
);
}
Lưu ý tôi sử dụng indexOf()
thay vì lastIndexOf()
vậy nó sẽ kiểm tra lần xuất hiện đầu tiên của các chuỗi đó
strlength1
biến là gì? Giá trị nên được sử dụng nội tuyến thay thế. Ngoài ra, không rõ bạn đang sử dụng kiểu trường hợp nào. strlength1
- không có phong cách, whole_str
- trường hợp rắn.
Hãy thử điều này để Nhận chuỗi con giữa hai ký tự bằng cách sử dụng javascript.
$("button").click(function(){
var myStr = "MyLongString:StringIWant;";
var subStr = myStr.match(":(.*);");
alert(subStr[1]);
});
Sử dụng jQuery :
get_between <- function(str, first_character, last_character) {
new_str = str.match(first_character + "(.*)" + last_character)[1].trim()
return(new_str)
}
chuỗi
my_string = 'and the thing that ! on the @ with the ^^ goes now'
cách sử dụng :
get_between(my_string, 'that', 'now')
kết quả :
"! on the @ with the ^^ goes
Một hàm nhỏ tôi đã tạo có thể lấy chuỗi giữa và có thể (tùy chọn) bỏ qua một số từ phù hợp để lấy một chỉ mục cụ thể.
Ngoài ra, thiết lập start
để false
sẽ sử dụng đầu của chuỗi, và thiết lập end
để false
sẽ sử dụng sự kết thúc của chuỗi.
được đặt pos1
ở vị trí của start
văn bản bạn muốn sử dụng, 1
sẽ sử dụng lần xuất hiện đầu tiên củastart
pos2
thực hiện tương tự như pos1
, nhưng cho end
và 1
sẽ sử dụng lần xuất hiện đầu tiên end
chỉ sau đó start
, lần xuất hiện end
trước start
bị bỏ qua.
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;
}