我很难找到正则表达式。我想用破折号替换空格,但前提是以下单词与class
或series
匹配。
我尝试过以下几种:
/s(?=[^s]*(class|series)$)/gi
' E-Class' => ' -E-Class'
'E Class' => 'E-Class'
' E Class' => ' E-Class'
上面的距离很近,但如果已经有破折号,它会把破折号放在前面,这是不应该的。
以下regex/方法符合OP描述的标准。。。
/s(?=class|series)|s(w+-?)+(?=class|series)/gi
。
实际上,它是两个独立的正则表达式,一个(s(?=class|series)
(用于匹配模式(例如' E Class'
(的明显简单的情况,另一个(s(w+-?)+(?=class|series)
(用于更复杂的模式,例如' E-Class'
或' Ee-ef-fooSeries'
,其中OP希望";。。。用破折号替换空格,但仅当下面的单词[包含]CCD_ 9或CCD_(包含,不包含匹配;请参阅我上面的第一条评论(。
正则表达式的匹配结果需要由自定义的replacer函数处理。一个测试用例可能与下一个提供的类似。。。
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)
);
可以将上述基于OR
的正则表达式文本统一为一个与整体模式匹配的版本,同时捕获单词。。。
/s((?:w+-?)*(?:class|series))/gi
然后,上面的示例代码更改为。。。
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((?:w+-?)*(?:class|series))/gi);
function didPassTest([value, expectedValue]) {
return (value.replace(
regX, (match, word) => '-' + word
) === expectedValue);
}
console.log(
'testEntries.every(didPassTest) ?..',
testEntries.every(didPassTest)
);
设法弄清楚了这一点,正如预期的那样:
/s(?=class|series)/gi
我认为你应该只匹配类或系列之前的空格,而不是之前的每个空格,这样你就可以尝试这样的东西:
/s(class|series)$/gi
由于你的积极展望中有[^s]*
(无空格(,所以每个以class
或series
结尾的单词(如E-Class
或abcdefclass
(都与你的积极前瞻相匹配。如果你只想替换class
和series
前面的空间,你可以简单地删除它并使用/s(?=(class|series)$)/gi