我有一个像<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>)
答案 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);