javascript - 如何从搜索中排除包含转义字符的整个单词?

标签 javascript regex

我正在尝试找到一种方法来匹配单个字符,除非它在特定单词中。

问题是我试图找到所有的“/”,但不是“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));

让我简要介绍一下它的作用。

  1. 首先转义exceptions 数组中的所有正则表达式特殊字符。
  2. 使用 | 字符(正则表达式或)将它们连接在一起。
  3. 现在是正则表达式本身。匹配其中一个异常(exception)。匹配项必须后跟 / 字符或字符串结尾 ($)。如果所有异常都不匹配,则检查字符是否为非 /。如果是这种情况,请匹配尽可能多的非 /

注意:如果由于某种原因您有异常(exception) A/BA/B/C,您应该重新排列数组以便A/B/C 出现在 A/B 之前。如果没有这样做,你会得到字符串 "A/B/C" 的匹配项 ["A/B", "C"],因为A/B 后面确实跟了一个正斜杠。根据字符串长度(最大优先)对数组进行排序可以解决此问题。

关于javascript - 如何从搜索中排除包含转义字符的整个单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56480169/

相关文章:

javascript - 对多个 id 使用相同的 javascript 操作仅索引号不同

javascript - 按元素和类开头的 jquery 复杂选择器

javascript - 使用 Highcharts.js 绘制动态添加的数组元素

java - 正则表达式匹配句子Java

javascript - 提取两个标记之间的子字符串。第二个 token 可能丢失

java - 正则表达式 - 无法访问的语句

javascript - 包装 Collection.insert

javascript - 验证码 : hooking to TextBox's OnKeyDown from script

python - python 3 中的 List 中的特定模式字符串

javascript - 验证 JavaScript 中任意两个特定字母的输入,例如 'a' 和 'i',并将 'a' 替换为 @,将 'i' 替换为?