[英]Count number of matches of a regex in Javascript
我想編寫一個正則表達式來計算一段文本中的空格/制表符/換行符的數量。 所以我天真地寫了以下內容:-
numSpaces : function(text) {
return text.match(/\s/).length;
}
由於某些未知原因,它總是返回1
。 上面的說法有什么問題? 從那以后,我用以下方法解決了這個問題:-
numSpaces : function(text) {
return (text.split(/\s/).length -1);
}
tl;dr:通用模式計數器
// THIS IS WHAT YOU NEED
const count = (str) => {
const re = /YOUR_PATTERN_HERE/g
return ((str || '').match(re) || []).length
}
對於那些來到這里尋找一種通用方法來計算字符串中正則表達式模式出現次數的人,並且不希望它在出現次數為零時失敗,此代碼正是您所需要的。 這是一個演示:
/* * Example */ const count = (str) => { const re = /[az]{3}/g return ((str || '').match(re) || []).length } const str1 = 'abc, def, ghi' const str2 = 'ABC, DEF, GHI' console.log(`'${str1}' has ${count(str1)} occurrences of pattern '/[az]{3}/g'`) console.log(`'${str2}' has ${count(str2)} occurrences of pattern '/[az]{3}/g'`)
原答案
您的初始代碼的問題在於您缺少全局標識符:
>>> 'hi there how are you'.match(/\s/g).length;
4
如果沒有正則表達式的g
部分,它只會匹配第一次出現並在那里停止。
另請注意,您的正則表達式將連續計算兩次空格:
>>> 'hi there'.match(/\s/g).length;
2
如果這是不可取的,你可以這樣做:
>>> 'hi there'.match(/\s+/g).length;
1
正如我之前的回答中提到的,您可以使用RegExp.exec()
迭代所有匹配項並計算每次出現的次數; 優勢僅限於內存,因為總的來說它比使用String.match()
慢約 20%。
var re = /\s/g,
count = 0;
while (re.exec(text) !== null) {
++count;
}
return count;
(('a a a').match(/b/g) || []).length; // 0
(('a a a').match(/a/g) || []).length; // 3
基於https://stackoverflow.com/a/48195124/16777,但已修復以在零結果情況下實際工作。
('my string'.match(/\\s/g) || []).length;
這當然是有很多陷阱的東西。 我正在使用 Paolo Bergantino 的答案,並意識到即使這樣也有一些局限性。 我發現使用日期的字符串表示是快速找到一些主要問題的好地方。 從這樣的輸入字符串開始: '12-2-2019 5:1:48.670'
並像這樣設置 Paolo 的函數:
function count(re, str) {
if (typeof re !== "string") {
return 0;
}
re = (re === '.') ? ('\\' + re) : re;
var cre = new RegExp(re, 'g');
return ((str || '').match(cre) || []).length;
}
我希望傳入正則表達式,以便函數更可重用,其次,我希望參數是字符串,這樣客戶端就不必制作正則表達式,而只需匹配字符串,例如標准的字符串實用程序類方法。
現在,在這里您可以看到我正在處理輸入問題。 具有以下內容:
if (typeof re !== "string") {
return 0;
}
我確保輸入不是文字0
、 false
、 undefined
或null
,它們都不是字符串。 由於這些文字不在輸入字符串中,因此應該沒有匹配項,但它應該匹配'0'
,這是一個字符串。
具有以下內容:
re = (re === '.') ? ('\\' + re) : re;
我正在處理這樣一個事實,即 RegExp 構造函數將(我認為,錯誤地)解釋字符串'.'
作為所有字符匹配器\\.\\
最后,因為我正在使用 RegExp 構造函數,所以我需要給它全局'g'
標志,以便它計算所有匹配項,而不僅僅是第一個,類似於其他帖子中的建議。
我意識到這是一個非常晚的答案,但它可能對在這里磕磕絆絆的人有所幫助。 順便說一句,這里是 TypeScript 版本:
function count(re: string, str: string): number {
if (typeof re !== 'string') {
return 0;
}
re = (re === '.') ? ('\\' + re) : re;
const cre = new RegExp(re, 'g');
return ((str || '').match(cre) || []).length;
}
使用現代語法避免了創建一個虛擬數組來計算長度 0 的需要
const countMatches = (exp, str) => str.match(exp)?.length ?? 0;
必須將exp
作為RegExp
傳遞,將str
作為String
傳遞。
這樣怎么樣
function isint(str){
if(str.match(/\d/g).length==str.length){
return true;
}
else {
return false
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.