如何从搜索中排除包括转义字符在内的整个单词?

时间:2019-06-06 14:56:06

标签: javascript regex

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

问题是我试图找到所有的'/',而不是'TCP / IP'中的那些。我发现可以使用负前瞻功能,但是问题是要排除整个“ TCP / IP”字样。 当我转义'/'时,它会使否定的提前查询错误。

经过测试的正则表达式为:

(?!TCP\/IP)\/

要测试的数据:

PHP/JAVA/TCP/IP/PYTHON/JAVASCRIPT

它应该匹配每个'/',除了'TCP / IP'内部的那个

但是,当我使用regex101.com测试正则表达式时,当我添加/:时,我的负向超前部分变得麻木了。

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)

似乎不再将其视为一个单词。

我认为可以轻松解决此问题,但目前我无法解决。

谢谢。

5 个答案:

答案 0 :(得分:2)

除了匹配斜杠以进行拆分外,您还可以使用“反向”正则表达式来查找所有匹配项。

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));

如果您有更多的例外情况,可以通过执行以下操作来使其动态化:

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. |字符(正则表达式OR)一起加入。
  3. 现在使用正则表达式本身。匹配例外之一。匹配项之后必须是/字符或字符串的结尾($)。如果所有异常均不匹配,请检查字符是否为非/。如果是这种情况,请尽可能多地匹配非/

注意::如果由于某些原因而有A/BA/B/C例外,则应重新排列数组,以使A/B/C在{{1}之前}。如果不这样做,则由于A/B的后面确实有一个正斜杠,因此您将获得与字符串["A/B", "C"]匹配的"A/B/C"。根据字符串长度对数组进行排序(从大到大)可以解决此问题。

答案 1 :(得分:1)

没有The "negative lookbehind" feature may not be supported in all browsers.警告。

const string = 'PHP/JAVA/TCP/IP/PYTHON/JAVASCRIPT/ABC/ABDEFIP';
const regex = /\/(?![^TCP]*IP)/g;
const output = string.replace(regex, ' ');

console.log(output);

答案 2 :(得分:1)

由于不完全支持负向后置,因此您可以匹配不需要的内容,并在捕获组中捕获所需的内容。

您的值在第一个捕获组$1

\bTCP\/IP\b|(\/)

这将匹配:

  • \bTCP\/IP\b在单词边界之间匹配TCP / IP
  • |
  • (!\/)在第1组中捕获正斜杠

查看regex demo

答案 3 :(得分:0)

我能够使用Regexr构建与我所相信的要求相匹配的Regex-/中不存在的每个TCP/IP

我必须将您的视野分为对TCP((?<!TCP))的否定后视,然后对/\/)进行否定后视,然后对IP((?!IP))进行负后视< / p>

生成的正则表达式为(?<!TCP)\/(?!IP)

请参阅:https://regexr.com/4fccb

答案 4 :(得分:0)

我无法找到一种使用纯正则表达式的方法,但是正则表达式的另一种选择是只在/上拆分,然后迭代一次生成的数组以处理{{ 1}}条目:

TCP/IP