Nhận chuỗi con giữa hai ký tự bằng cách sử dụng javascript


193

Tôi đang cố gắng trích xuất một chuỗi từ bên trong một chuỗi lớn hơn, nơi nó có được mọi thứ nằm giữa một ':' và ';'.

Hiện hành

Str = 'MyLongString:StringIWant;'

Sản phẩm chất lượng

newStr = 'StringIWant'

Câu trả lời:


423

Bạn có thể thử cái này

var mySubString = str.substring(
    str.lastIndexOf(":") + 1, 
    str.lastIndexOf(";")
);

4
Giải pháp tầm thường nhưng tiện dụng đặc biệt nếu bạn muốn tránh các biểu thức thông thường.
Nikolay Frick

8
Có ai biết làm thế nào tôi sẽ làm điều này cho mỗi lần xuất hiện của một chuỗi con giữa chuỗi bắt đầu và kết thúc của tôi không?
MarksCode

6
@VirtualTroll 8 giây? Thánh thần tôi muốn xem "giải pháp" của bạn: D
tom

@tom mặc dù "8 giây" không có ngữ cảnh không mang bất kỳ thông tin có ý nghĩa nào - nhưng tôi khá chắc chắn rằng đó không phải là sự khác biệt của một lần chạy)
ego

7
Tôi chắc chắn rằng anh ấy có nghĩa là câu trả lời này đã được đăng 8 giây trước đó. Trong khi anh ấy đang viết nó.
MaxSantos

110

Bạn cũng có thể thử điều này:

var str = 'one:two;three';    
str.split(':').pop().split(';')[0]; // returns 'two'

13
Không có regex. Yêu nó.
flimflam57

str.split(':').pop().split(';')[0]có thể nhanh hơn sử dụng.shift()
MysteryPancake

48

Sử dụng split()

var s = 'MyLongString:StringIWant;';
var arrStr = s.split(/[:;]/);
alert(arrStr);

arrStrsẽ 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]);

Chuỗi tôi muốn nằm giữa [] và chuỗi này không hoạt động ... ví dụ: 'MyLongString [StringIWant]'. Split (/ [[]] /);
Philippe

1
@Philippe Đối với trường hợp sử dụng của bạn, hãy sử dụng regex này \[(.*?)\] ---> 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.
asifsid88

33

@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.

  • Phương pháp đầu tiên: là thực sự có được một chuỗi con từ giữa hai chuỗi (tuy nhiên nó sẽ chỉ tìm thấy một kết quả).
  • Phương pháp thứ hai: sẽ loại bỏ kết quả được tìm thấy gần đây nhất với các chuỗi con sau và trước nó.
  • Phương thức thứ ba: sẽ thực hiện hai phương thức đệ quy trên một chuỗi.
  • Phương pháp thứ tư: sẽ áp dụng phương pháp thứ ba và trả về kết quả.

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;
    }
};

Sử dụng như thế nào?

Thí dụ:

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]

Bắt một RangeError: Maximum call stack size exceededngoại lệ.
Alejandro Cotilla

1
Câu trả lời chính xác. đây chỉ là những gì tôi cần
Andres Felipe

20
var s = 'MyLongString:StringIWant;';
/:([^;]+);/.exec(s)[1]; // StringIWant

1
Mục đích của là gì; trong [^;]
Jaakko Karhu

2
bản dịch là: "/" bắt đầu mô hình. Nối một ":" với "[]" bất cứ thứ gì của "^;" không bán dấu hai chấm "+" nhiều lần rồi tìm dấu ";" dấu chấm phẩy và "/" kết thúc mẫu.
Nhà phát

15

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 đã thử nghiệm điều này trong Webpart SharePoint 2013 và hoạt động rất tốt nếu điều đó giúp được bất kỳ ai trong tương lai!
Shane Gib.

3
Điều này có thể không hoạt động nếu chuỗi mà bạn muốn nằm giữa "(" và ")"
bravokeyl

4

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]

4
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

Đây là một giải pháp tuyệt vời cho chuỗi giữa 2 ký tự
Phani Shashank

3

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 replacechứ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 đó!


2

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");

// &#34 - 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,'&#34')">Click</button>
  
  </div>

</div>


2

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 đó


Chức năng đẹp và rất dễ đọc. Nhưng mục đích của strlength1biế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.
Boris


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

1

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để falsesẽ sử dụng đầu của chuỗi, và thiết lập endđể falsesẽ sử dụng sự kết thúc của chuỗi.

được đặt pos1ở vị trí của startvăn bản bạn muốn sử dụng, 1sẽ sử dụng lần xuất hiện đầu tiên củastart

pos2thực hiện tương tự như pos1, nhưng cho end1sẽ sử dụng lần xuất hiện đầu tiên endchỉ sau đó start, lần xuất hiện endtrước startbị 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;
}

1

Đây có thể là giải pháp khả thi

var str = 'RACK NO:Stock;PRODUCT TYPE:Stock Sale;PART N0:0035719061;INDEX NO:21A627 042;PART NAME:SPRING;';  
var newstr = str.split(':')[1].split(';')[0]; // return value as 'Stock'

console.log('stringvalue',newstr)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.