我试图找到一种匹配单个字符的方法,除非它在特定单词中。
问题是我试图找到所有的'/',而不是'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)
似乎不再将其视为一个单词。
我认为可以轻松解决此问题,但目前我无法解决。
谢谢。
答案 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));
让我简要介绍一下它的作用。
exceptions
数组中的所有正则表达式特殊字符。|
字符(正则表达式OR)一起加入。/
字符或字符串的结尾($
)。如果所有异常均不匹配,请检查字符是否为非/
。如果是这种情况,请尽可能多地匹配非/
。 注意::如果由于某些原因而有A/B
和A/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组中捕获正斜杠答案 3 :(得分:0)
我能够使用Regexr构建与我所相信的要求相匹配的Regex-/
中不存在的每个TCP/IP
。
我必须将您的视野分为对TCP((?<!TCP)
)的否定后视,然后对/
(\/
)进行否定后视,然后对IP((?!IP)
)进行负后视< / p>
生成的正则表达式为(?<!TCP)\/(?!IP)
答案 4 :(得分:0)
我无法找到一种使用纯正则表达式的方法,但是正则表达式的另一种选择是只在/
上拆分,然后迭代一次生成的数组以处理{{ 1}}条目:
TCP/IP