使用Regex

时间:2019-07-15 21:19:33

标签: javascript regex

我有一个解决复杂的问题的方法: 我想从可能的长文本中过滤出子字符串。有某些关键字指示子字符串。仅当关键字前面至少有一个字符(不是空格或其他关键字)时,才应匹配。然后,他们关键字开头的每个字符也应包括在匹配项中。我想为此在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:']

1 个答案:

答案 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):匹配:之间的任何列表

Regex demo

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));