Câu trả lời:
exec
trả về một đối tượng có thuộc index
tính:
var match = /bar/.exec("foobar");
if (match) {
console.log("match found at " + match.index);
}
Và cho nhiều trận đấu:
var re = /bar/g,
str = "foobarfoobar";
while ((match = re.exec(str)) != null) {
console.log("match found at " + match.index);
}
re
như một biến và thêm công cụ g
sửa đổi đều rất quan trọng! Nếu không bạn sẽ có được một vòng lặp vô tận.
undefined
. jsfiddle.net/6uwn1vof/2 không phải là một ví dụ giống như tìm kiếm như của bạn.
g
cờ và nó sẽ hoạt động. Vì match
là một hàm của chuỗi, không phải là regex nên nó không thể là trạng thái như exec
vậy, vì vậy nó chỉ xử lý nó như exec
(nghĩa là có thuộc tính chỉ mục) nếu bạn không tìm kiếm một kết quả khớp toàn cầu ... bởi vì tính trạng thái không quan trọng .
Đây là những gì tôi nghĩ ra:
// Finds starting and ending positions of quoted text
// in double or single quotes with escape char support like \" \'
var str = "this is a \"quoted\" string as you can 'read'";
var patt = /'((?:\\.|[^'])*)'|"((?:\\.|[^"])*)"/igm;
while (match = patt.exec(str)) {
console.log(match.index + ' ' + patt.lastIndex);
}
match.index + match[0].length
cũng hoạt động cho vị trí cuối.
match.index + match[0].length - 1
gì?
.slice()
và .substring()
. Kết thúc bao gồm sẽ là 1 ít hơn như bạn nói. (Hãy cẩn thận rằng đã bao gồm thường có nghĩa là chỉ số của char cuối cùng trong trận đấu, trừ khi đó là một trận đấu có sản phẩm nào trong đó đã ghi bàn 1 trước khi trận đấu và có thể là -1
bên ngoài chuỗi hoàn toàn cho trận đấu trống ở đầu ...)
Từ tài liệu developer.mozilla.org trên .match()
phương thức String :
Mảng được trả về có một thuộc tính đầu vào bổ sung, chứa chuỗi gốc được phân tích cú pháp. Ngoài ra, nó có một thuộc tính chỉ mục, đại diện cho chỉ số dựa trên không của trận đấu trong chuỗi .
Khi giao dịch với regex không toàn cầu (nghĩa là không có g
cờ trên regex của bạn), giá trị được trả về .match()
có một thuộc index
tính ... tất cả những gì bạn phải làm là truy cập vào nó.
var index = str.match(/regex/).index;
Đây là một ví dụ cho thấy nó hoạt động tốt:
var str = 'my string here';
var index = str.match(/here/).index;
alert(index); // <- 10
Tôi đã thử nghiệm thành công tất cả các cách trở lại IE5.
Bạn có thể sử dụng search
phương thức của String
đối tượng. Điều này sẽ chỉ hoạt động cho trận đấu đầu tiên, nhưng nếu không sẽ làm những gì bạn mô tả. Ví dụ:
"How are you?".search(/are/);
// 4
Đây là một tính năng thú vị mà tôi phát hiện ra gần đây, tôi đã thử nó trên bảng điều khiển và nó dường như hoạt động:
var text = "border-bottom-left-radius";
var newText = text.replace(/-/g,function(match, index){
return " " + index + " ";
});
Mà trả về: "viền 6 đáy 13 bán kính 18 trái"
Vì vậy, đây dường như là những gì bạn đang tìm kiếm.
arguments
đó là vị trí. Không phải "đối số thứ hai". Các đối số chức năng là "kết hợp đầy đủ, nhóm1, nhóm2, ...., chỉ số khớp, chuỗi đầy đủ khớp với"
Thành viên fn này trả về một mảng các vị trí dựa trên 0, nếu có, của từ đầu vào bên trong đối tượng String
String.prototype.matching_positions = function( _word, _case_sensitive, _whole_words, _multiline )
{
/*besides '_word' param, others are flags (0|1)*/
var _match_pattern = "g"+(_case_sensitive?"i":"")+(_multiline?"m":"") ;
var _bound = _whole_words ? "\\b" : "" ;
var _re = new RegExp( _bound+_word+_bound, _match_pattern );
var _pos = [], _chunk, _index = 0 ;
while( true )
{
_chunk = _re.exec( this ) ;
if ( _chunk == null ) break ;
_pos.push( _chunk['index'] ) ;
_re.lastIndex = _chunk['index']+1 ;
}
return _pos ;
}
Bây giờ cố gắng
var _sentence = "What do doers want ? What do doers need ?" ;
var _word = "do" ;
console.log( _sentence.matching_positions( _word, 1, 0, 0 ) );
console.log( _sentence.matching_positions( _word, 1, 1, 0 ) );
Bạn cũng có thể nhập biểu thức thông thường:
var _second = "z^2+2z-1" ;
console.log( _second.matching_positions( "[0-9]\z+", 0, 0, 0 ) );
Ở đây người ta có được chỉ số vị trí của thuật ngữ tuyến tính.
var str = "The rain in SPAIN stays mainly in the plain";
function searchIndex(str, searchValue, isCaseSensitive) {
var modifiers = isCaseSensitive ? 'gi' : 'g';
var regExpValue = new RegExp(searchValue, modifiers);
var matches = [];
var startIndex = 0;
var arr = str.match(regExpValue);
[].forEach.call(arr, function(element) {
startIndex = str.indexOf(element, startIndex);
matches.push(startIndex++);
});
return matches;
}
console.log(searchIndex(str, 'ain', true));
str.indexOf
Ở đây chỉ tìm thấy sự xuất hiện tiếp theo của văn bản được bắt bởi trận đấu, mà không nhất thiết là trận đấu. Regex JS hỗ trợ các điều kiện trên văn bản bên ngoài bản chụp với giao diện. Chẳng hạn searchIndex("foobarfoobaz", "foo(?=baz)", true)
nên cho [6]
, không [0]
.
Trong các trình duyệt hiện đại, bạn có thể thực hiện việc này với string.matchAll () .
Lợi ích của phương pháp này so với phương pháp RegExp.exec()
này là nó không phụ thuộc vào biểu thức chính quy, như trong câu trả lời của @ Gumbo .
let regexp = /bar/g;
let str = 'foobarfoobar';
let matches = [...str.matchAll(regexp)];
matches.forEach((match) => {
console.log("match found at " + match.index);
});
function trimRegex(str, regex){
return str.substr(str.match(regex).index).split('').reverse().join('').substr(str.match(regex).index).split('').reverse().join('');
}
let test = '||ab||cd||';
trimRegex(test, /[^|]/);
console.log(test); //output: ab||cd
hoặc là
function trimChar(str, trim, req){
let regex = new RegExp('[^'+trim+']');
return str.substr(str.match(regex).index).split('').reverse().join('').substr(str.match(regex).index).split('').reverse().join('');
}
let test = '||ab||cd||';
trimChar(test, '|');
console.log(test); //output: ab||cd