Regex匹配任意一个单词,但匹配确切的单词



我很难找到正则表达式。我想用破折号替换空格,但前提是以下单词与classseries匹配。

我尝试过以下几种:

/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]*(无空格(,所以每个以classseries结尾的单词(如E-Classabcdefclass(都与你的积极前瞻相匹配。如果你只想替换classseries前面的空间,你可以简单地删除它并使用/s(?=(class|series)$)/gi

最新更新