我有一个解决复杂的问题的方法: 我想从可能的长文本中过滤出子字符串。有某些关键字指示子字符串。仅当关键字前面至少有一个字符(不是空格或其他关键字)时,才应匹配。然后,他们关键字开头的每个字符也应包括在匹配项中。我想为此在JavaScript中使用正则表达式。
我的关键字是:“:yellow:”,“:black:”,“:green:”,“:blue:”“:red:”
例如,我有一个这样的文本:“:green:aba:red:gd efg:blue::yellow:sdg:red:sea gea e:black:”
现在,我想在此字符串上使用match(),并赋予re这些匹配项:“ aba:red:”,“ gd efg:blue” :,“ sdg:red:”,sea gea e:black :
:绿色:开头不应该匹配,因为它前面没有字符。 :yellow:也不应匹配,因为它前面有一个不同的关键字(在本例中为:blue :)
当关键字优先于其他关键字时,我尝试使用否定的超前表达式(例如(?!))来防止匹配。 但这并不能完全给我我想要的结果。
/((?!(:yellow:|:black:|:green:|:blue:|:red:))\S+\s*)+(:yellow:|:black:|:green:|:blue:|:red:)/g
let ar1 = text1.match(re1);
console.log(ar1);
这是我的输出: ['green:aba:red:', 'gd efg:blue::yellow:', 'sdg:red:大海gee e:black:']
但是我想要这个:
['aba:red:', 'gd efg:blue:', 'sdg:red:', 'sea gea e:black:']
答案 0 :(得分:4)
您可以通过将:
放在其外部来缩短替换,而不是匹配\S+
,而不能使用negated character class来匹配空白字符或:
。
要匹配多个“单词”,您可以重复匹配一个空格并再次使用取反的字符类。
(?!:(?:yellow|black|green|blue|red):)[^\s:]+(?: [^\s:]+)*\s*:(?:yellow|black|green|blue|red):
说明
(?!
负向查找,断言直接在右边的不是
:(?:yellow|black|green|blue|red):
匹配:
之间的任何列表)
近距离否定预测[^\s:]+
匹配1次以上,而不是空格字符或:
(?: [^\s:]+)*
重复0+次匹配一个空格,然后1+次不是空格字符或:
\s*
匹配0+个空格字符:(?:yellow|black|green|blue|red):
匹配:
之间的任何列表
const regex = /(?!:(?:yellow|black|green|blue|red):|\s)[^\s:]+(?: [^\s:]+)*\s*:(?:yellow|black|green|blue|red):/g;
const str = ` :green: aba :red: gd efg:blue: :yellow: sdg:red: sea gea e :black: `;
console.log(str.match(regex));