我正在尝试找到一种方法来匹配单个字符,除非它在特定单词中。
问题是我试图找到所有的“/”,但不是“TCP/IP”中的那些。我发现 Negative Lookahead 可以完成这项工作,但问题是要排除整个“TCP/IP”字样。 当我转义 '/' 时,它会使负前瞻错误。
测试的正则表达式是:
(?!TCP\/IP)\/
要测试的数据:
PHP/JAVA/TCP/IP/PYTHON/JAVASCRIPT
它应该匹配每个“/”,除了“TCP/IP”中的那个
但是,当我使用 regex101.com 测试正则表达式时,当我添加/: 时,我的负面前瞻部分变得 NumPy 了
Negative Lookahead (?!TCP\/IP)
Assert that the Regex below does not match
TCP matches the characters TCP literally (case insensitive)
\/ matches the character / literally (case insensitive)
IP matches the characters IP literally (case insensitive)
它似乎不再被视为一个单词。
我认为它可以很容易地修复,但我目前没有解决方案。
谢谢。
最佳答案
除了匹配要拆分的斜杠,您还可以使用“反向”正则表达式来查找所有匹配项。
const string = "PHP/JAVA/TCP/IP/PYTHON/JAVASCRIPT";
const regex = /(TCP\/IP)(?=\/|$)|[^/]+/g;
// ^ ^
// The group is unnecessary here, but is required in my second example.
console.log(string.match(regex));
如果您有更多异常(exception)情况,您可以通过执行以下操作使其动态化:
const string = "PHP/JAVA/TCP/IP/PYTHON/JAVASCRIPT/AB/CDE/FOO/UDP/TCP/AB/CD";
const exceptions = ["TCP/IP", "AB/CD", "AB/CDE", "UDP/TCP"];
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
let pattern = exceptions.map(escapeRegExp).join('|');
pattern = `(${pattern})(?=/|$)|[^/]+`;
const regex = new RegExp(pattern, "g");
console.log(string.match(regex));
让我简要介绍一下它的作用。
- 首先转义
exceptions
数组中的所有正则表达式特殊字符。 - 使用
|
字符(正则表达式或)将它们连接在一起。 - 现在是正则表达式本身。匹配其中一个异常(exception)。匹配项必须后跟
/
字符或字符串结尾 ($
)。如果所有异常都不匹配,则检查字符是否为非/
。如果是这种情况,请匹配尽可能多的非/
。
注意:如果由于某种原因您有异常(exception) A/B
和 A/B/C
,您应该重新排列数组以便A/B/C
出现在 A/B
之前。如果没有这样做,你会得到字符串 "A/B/C"
的匹配项 ["A/B", "C"]
,因为A/B
后面确实跟了一个正斜杠。根据字符串长度(最大优先)对数组进行排序可以解决此问题。
关于javascript - 如何从搜索中排除包含转义字符的整个单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56480169/