如果不包含水果,如何从以下模式捕获水果 里面有芒果或葡萄?
输入:
<frutis>banana,apple,orrange,lichie</frutis>
<frutis>banana,apple,mango,lichie</frutis>
<frutis>banana,grapes,orrange,lichie</frutis>
<frutis>banana,apple,orrange,guava</frutis>
输出: 香蕉,苹果,orrange,lichie 假 假 香蕉,苹果,orrange,番石榴&LT;
我尝试了以下内容:
<frutis>([^mango|grapes]*)<\/frutis>
答案 0 :(得分:1)
你可以使用负面预测,就像使用这个正则表达式一样:
2016-10-09T17:55:12.2253192Z Starting task: Compile SSIS Packages
2016-10-09T17:55:12.2253192Z Executing the following command-line. (workingFolder = C:\Agents\TFSBuild\_work\1\s\DataResync)
2016-10-09T17:55:12.2253192Z "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe" SSIS_Sync\SSIS_Sync.dtproj /Build Development
2016-10-09T17:55:12.2253192Z Error message highlight pattern:
2016-10-09T17:55:12.2253192Z Warning message highlight pattern:
2016-10-09T17:55:12.2253192Z C:\Windows\system32\cmd.exe /c ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe" SSIS_Sync\SSIS_Sync.dtproj /Build Development"
2016-10-09T17:55:12.6315610Z Finishing task: CmdLine
正如你所写,它不起作用,因为类<frutis>(?!.*mango)(?!.*grapes).*<\/frutis>
是关于匹配单个字符,而不是关于序列。此外,管道符号在类中没有特殊含义,它只是表示文字[.....]
。
注意:为了匹配XML结构中的数据,不建议使用正则表达式,而是使用DOM解析器。
答案 1 :(得分:0)
试试这个:
const regex = /<frutis>((?:(?!mango|grapes).)*)<\/frutis>/g;
const str = `<frutis>banana,apple,orrange,lichie</frutis>
<frutis>banana,apple,mango,lichie</frutis>
<frutis>banana,grapes,orrange,lichie</frutis>
<frutis>banana,apple,orrange,guava</frutis>`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
源代码:
{{1}}
我已经使用负面向前检测是否存在两个字符串。 可以找到完整的说明here