2016-03-01 73 views
3

考慮在Perl下面的正則表達式的代碼片段:JavaScript正則表達式匹配是否需要重複代碼?

if ($message =~ /^(.+) enters the race!$/)) { 
    $racer = $1; 
    print "Found $racer"; 
} else { 
    print "Racer parsing error!"; 
} 

我試圖端口這JavaScript和這裏就是我想出了:

if (message.match(/^.+ enters the race!$/)) { 
    var racer = message.match(/^(.+) enters the race!$/)[1]; 
    console.log("Found " + racer); 
} else { 
    console.log("Racer parsing error!"); 
} 

注意正則表達式怎麼有重複兩次。這看起來馬虎。更不用說它浪費了處理能力,因爲它必須連續執行兩次相同的正則表達式。有什麼辦法讓這段代碼看起來更清潔嗎?

+0

也許只是做'if(racer = message.match(/^(.+)進入比賽!$ /)[1]){..} else {..}' – sln

回答

1

有你在Perl和JS有代碼之間的一些差異:

  • JS沒有串插,所以您的代碼是一個有點冗長
  • 沒有$1般的全球變量,儘管你可以聲明它並在代碼中使用。

你可以先匹配並檢查正則表達式是否匹配任何東西。

var message = "John enters the race!"; 
 
var m = message.match(/^(.+) enters the race!$/); // Match the string with a pattern 
 
if (m) {           // Check if there is a match 
 
    var racer = m[1];        // Assign the captured substring to `racer` 
 
    console.log("Found " + racer);    
 
} else { 
 
    console.log("Racer parsing error!"); 
 
}

注意m這裏是含有Match對象:

  • m[0] - 全匹配的文本
  • m[1] - 第1組中的內容(捕獲組1)
  • m.index - 基於0匹配字符串
  • m.input在指數 - 原始字符串
2

您可以檢查正則表達式匹配正確的if語句。像這樣的東西會工作:

的JavaScript

function check(message) { 
    if (racer = message.match(/^(.+) enters the race!$/)) { 
    console.log("Found " + racer[1]); 
    } else { 
    console.log("Racer parsing error!"); 
    } 
} 


check("blah enters the race!") 
check("blah blah blah") 

輸出

找到胡說
賽車解析錯誤!

+0

您的評論錯過了編輯到20秒。 –

+0

@WiktorStribiżew如果捕獲組爲空,則不存在正則表達式匹配並觸發else語句。 –

1

您可以將匹配結果存儲在一個變量:

var result = message.match(/^.+ enters the race!$/); 
if (result) { 
    var racer = result[1]; 
    console.log("Found " + racer); 
} else { 
    console.log("Racer parsing error!"); 
} 
0

您可以一次運行match命令。如果失敗,getmatches將爲空。如果它是成功的,getmatches[1]將包含賽車手的名字

var rgx = /^(.+) enters the race!$/, 
 
    message = window.prompt('Enter Message'), 
 
    getmatches = message.match(rgx); 
 
if (getmatches) { 
 
    var racer = getmatches[1]; 
 
    console.log("Found " + racer); 
 
} else { 
 
    console.log("Racer parsing error!"); 
 
}

0

我想你應該創建一個RegExp實例,並使用test()exec()方法如下:

var myRegExp = new RegExp('^(.+) enters the race!$'); 

var message = 'Someone enters the race!'; 

if (myRegExp.test(message)) { 
    var racer = myRegExp.exec(message)[1]; 
    console.log('Found ' + racer); 
} 
else { 
    console.log('Racer parsing error!'); 
} 

注的用法正則表達式中的()

相關問題