正则表达式仅匹配不关键字

时间:2019-03-08 14:28:22

标签: regex google-apps-script

我有一个像<dlskjfldjf>Text creation List<string> checking edit<br/>这样的字符串。需要正则表达式帮助以仅匹配<dlskjfldjf>而不匹配List<string>

关键字可以是任何通用类型,例如

IList<T>
List<T>
etc

我尝试使用<([a-zA-Z]+)>来匹配<dlskjfldjf>,下面使用List<string>来匹配,但不确定如何将两者混合使用

((List|ilist|IList|IEnumerable|IQuerable)(<)([A-Za-z.,\[\]\s]*)(>))|(<T>)

3 个答案:

答案 0 :(得分:1)

在断言(?<! expression )后使用零宽度的负向后看:

string pattern = @"(?<!(List|ilist|IList|IEnumerable|IQuerable))<([a-zA-Z]+)>";

答案 1 :(得分:1)

在支持Negative Lookbehind的语言中,可以使用以下模式:

(?<!(List|ilist|IList|IEnumerable|IQuerable))<([a-zA-Z]+)>

在JavaScript中,您可能需要使用两种模式才能获得相同的结果,请对尖括号模式进行一次测试,然后再次进行测试以确保之前没有类型信息。

答案 2 :(得分:1)

您可以做的就是匹配您不想保留的内容,并在组中捕获您想要保留的内容:

\b(?:List|ilist|IList|IEnumerable|IQuerable)<[^<>]*>|(<[a-zA-Z]+>)

这将匹配:

  • \b单词边界,以防止交替出现的任何列出单词成为较大单词的一部分
  • (?:非捕获组
    • List|ilist|IList|IEnumerable|IQuerable匹配项,将与列出的所有单词匹配
  • )关闭非捕获组
  • <[^<>]*>匹配<,而不是<> 0次以上,然后匹配>
  • |
  • (捕获组(您要保留的内容)
    • <[a-zA-Z]+>匹配<,然后是小写或大写字符的1+倍,然后是>
  • )关闭捕获组

例如:

const regex = /\b(?:List|ilist|IList|IEnumerable|IQuerable)<[^<>]*>|(<[a-zA-Z]+>)/g;
const str = `<dlskjfldjf>Text creation List<string> checking edit<br/> or IList<string> or <aAbB>`;
let m;
let res = [];

while ((m = regex.exec(str)) !== null) {
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  if (m[1] !== undefined) res.push(m[1]);
}
console.log(res);