[英]Regex match either word, but the exact word
我正在努力找出一個正則表達式。 我想用破折號替換空格,但前提是以下單詞與class
或series
匹配。
我嘗試了以下方法:
/\s(?=[^\s]*(class|series)$)/gi
' E-Class' => ' -E-Class'
'E Class' => 'E-Class'
' E Class' => ' E-Class'
上面很接近,但如果已經有一個破折號,它會在前面放一個,這是不應該的。
我相信你應該只匹配課堂或系列之前的空間,而不是之前的每個空間,這樣你就可以嘗試這樣的事情:
/\s(class|series)$/gi
設法弄清楚,這按預期工作:
/\\s(?=class|series)/gi
由於您的正面展望中有[^\\s]*
(無空格),因此以class
或series
結尾的每個單詞(如E-Class
或abcdefclass
)都與您的正面展望相匹配。 如果你只想替換class
和series
前面的空格,你可以簡單地刪除它並使用/\\s(?=(class|series)$)/gi
下面的正則表達式完成了 OP 所描述的工作......
/\\s(?=class|series)|\\s(\\w+-?)+(?=class|series)/gi
.
實際上它是兩個單獨的正則表達式,一個 ( \\s(?=class|series)
) 用於匹配例如' E Class'
的模式的明顯簡單情況,另一個 ( \\s(\\w+-?)+(?=class|series)
) 用於更復雜的模式,例如' E-Class'
或' Ee-ef-fooSeries'
,其中 OP 想要“...用破折號替換空格,但' Ee-ef-fooSeries'
是以下單詞[包含] class
或series
” (包含但不匹配;請參閱我上面的第一條評論)。
正則表達式的匹配結果需要由自定義替換函數處理。 測試用例可能看起來類似於下一個提供的測試用例......
const testEntries = [ // OP's request. [' E-Class', ' -E-Class'], ['E Class', 'E-Class'], [' E Class', ' E-Class'], // Bonus test. [' Ee-eClass', ' -Ee-eClass'], [' Ee-ef-Class', '-Ee-ef-Class'], [' Ee-ef-fooSeries', ' -Ee-ef-fooSeries'], ]; const regX = (/\\s(?=class|series)|\\s(\\w+-?)+(?=class|series)/gi); function didPassTest([value, expectedValue]) { return ( value.replace(regX, (match) => '-' + match.trim() ) === expectedValue ); } console.log( 'testEntries.every(didPassTest) ?..', testEntries.every(didPassTest) );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.